{{ define "main" }}
\n\n

Next Steps

\n\n\n","url":"/docs/irc/","relative_path":"_docs/irc.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Twitch IRC: Commands","parent_doc":"irc","order_number":4,"sub_menu_name":null,"slug":"commands","ext":".md","tags":[],"excerpt":"

Twitch IRC: Commands

\n","nav_count":0,"article_key":"commands","date":"2021-10-12 22:12:21 +0000","content":"

Twitch IRC: Commands

\n\n

Overview

\n\n

This guide explains the Twitch IRC miscellaneous command capabilities.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CommandDescription
[CLEARCHAT](#clearchat-twitch-commands)Purges a user’s messages, typically after a user is banned from chat or timed out.
[CLEARMSG](#clearmsg-twitch-commands)Single message removal on a channel. This is triggered by /delete <target-msg-id> on IRC.
[HOSTTARGET](#hosttarget-twitch-commands)Channel starts or stops host mode.
[NOTICE](#notice-twitch-commands)General notices from the server.
[RECONNECT](#reconnect-twitch-commands)Rejoins channels after a restart.
[ROOMSTATE](#roomstate-twitch-commands)Identifies the channel’s chat settings (for example, slow mode duration).
[USERNOTICE](#usernotice-twitch-commands)Announces Twitch-specific events to the channel (for example, a user’s subscription notification).
[USERSTATE](#userstate-twitch-commands)Identifies a user’s chat settings or properties (for example, chat color).
\n\n

CLEARCHAT (Twitch Commands)

\n\n

Purge a user’s messages, typically after a user is banned from chat or timed out.

\n\n

Prototype:

\n\n

> :tmi.twitch.tv CLEARCHAT #<channel> :<user>

\n\n

Use with the tags capability; see CLEARCHAT (Twitch Tags), which has additional parameters. If your IRC bot plans to read commands, it must also use the tags capability because most commands are less useful or even meaningless without tags. See CLEARCHAT (Twitch Tags), which has additional parameters.

\n\n

Example 1: Clear (delete) all chat on the dallas channel.

\n\n
> :tmi.twitch.tv CLEARCHAT #dallas\n
\n\n

Example 2: Clear (delete) all chat from a single user on the dallas channel.

\n\n
> :tmi.twitch.tv CLEARCHAT #dallas :ronni\n
\n\n

CLEARMSG (Twitch Commands)

\n\n

Single message removal on a channel. This is triggered by /delete <target-msg-id> on IRC. Use with the tags capability; see CLEARMSG (Twitch Tags).

\n\n

Prototype:

\n\n
> @login=<login>;target-msg-id=<target-msg-id> :tmi.twitch.tv CLEARMSG #<channel> :<message>\n
\n\n
ParameterDescription
loginName of the user who sent the message.
messageThe message.
target-msg-idUUID of the message.
\n\n

Example: ronni’s HeyGuys message is deleted from the dallas channel.

\n\n
> @login=ronni;target-msg-id=abc-123-def :tmi.twitch.tv CLEARMSG #dallas :HeyGuys\n
\n\n

HOSTTARGET (Twitch Commands)

\n\n

Channel starts or stops host mode.

\n\n

Channel starts host mode:

\n\n

Prototype:

\n\n
> :tmi.twitch.tv HOSTTARGET #hosting_channel :<channel> [<number-of-viewers>]\n
\n\n

Channel stops host mode:

\n\n

Prototype:

\n\n
> :tmi.twitch.tv HOSTTARGET #hosting_channel :- [<number-of-viewers>]\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription
number-of-viewers(Optional) Number of viewers watching the host. If provided, must be a positive integer.
\n\n

NOTICE (Twitch Commands)

\n\n

General notices from the server.

\n\n

Prototype: 

\n\n
> @msg-id=<msg id>:tmi.twitch.tv NOTICE #<channel> :<message>\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription
messageThe message.
msg idA message ID string. Can be used for i18ln. Valid values: see Twitch IRC: msg-id Tags.
\n\n

Example:

\n\n
> @msg-id=slow_off :tmi.twitch.tv NOTICE #dallas :This room is no longer in slow mode.\n
\n\n

RECONNECT (Twitch Commands)

\n\n

Rejoin channels after a restart.

\n\n

Occasionally, Twitch IRC processes need to be restarted. When this happens, clients that have requested  the IRC v3 twitch.tv/commands capability are issued a RECONNECT. After a short time, the connection is closed. In this case, reconnect and rejoin channels that were on the connection, as you would normally.

\n\n

ROOMSTATE (Twitch Commands)

\n\n

Used when a user joins a channel or a room setting.

\n\n

Prototype:

\n\n
> :tmi.twitch.tv ROOMSTATE #<channel>\n
\n\n

Use with the tags capability; see ROOMSTATE (Twitch Tags), which has additional parameters.

\n\n

USERNOTICE (Twitch Commands)

\n\n

Announces Twitch-specific events to the channel (for example, a user’s subscription notification).

\n\n

Use with the tags capability; see USERNOTICE (Twitch Tags), which has additional parameters.

\n\n

Prototype:

\n\n
> :tmi.twitch.tv USERNOTICE #<channel> :message\n
\n\n

USERSTATE (Twitch Commands)

\n\n

Identifies a user’s chat settings or properties (e.g., chat color).

\n\n

Use with the tags capability; see USERSTATE (Twitch Tags), which has additional parameters.

\n\n

Prototype:

\n\n
> :tmi.twitch.tv USERSTATE #<channel>\n
\n","url":"/docs/irc/commands/","relative_path":"_docs/irc/commands.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Guide","order_number":2,"parent_doc":"irc","sub_menu_name":null,"slug":"guide","ext":".md","tags":[],"excerpt":"

Chatbots & IRC Guide

\n","nav_count":0,"article_key":"guide","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC Guide

\n\n

Introduction

\n\n

Twitch offers an IRC interface to our chat functionality. This allows you to, for instance:

\n\n\n\n

While our IRC server generally follows RFC1459, there are several cases where it behaves slightly differently than other IRC servers. As described in this document, there are many Twitch-specific IRC capabilities. The differences are necessary to accommodate:

\n\n\n\n

Syntax Notes

\n\n

All references to <channel> and <user> are references to channel and user names not IDs. Always enter the channel name (<channel>) in lowercase. The examples in the following table use these syntax conventions:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Lines prefixed with:Are sent from:To:
<clientserver
>serverconnecting client
\n\n

Connecting to Twitch IRC

\n\n

To connect:

\n\n
 WebSocket ClientsIRC Clients
SSLwss://irc-ws.chat.twitch.tv:443irc://irc.chat.twitch.tv:6697
Otherwisews://irc-ws.chat.twitch.tv:80irc://irc.chat.twitch.tv:6667
\n\n

To authenticate, your password (pass) should be an OAuth token authorized through our API and should use both the chat:read scope (to read messages) and the chat:edit scope (to send messages).

\n\n\n\n

Your nickname (nick) must be your Twitch username (login name) in lowercase.

\n\n

A successful connection session looks like the following example:

\n\n
< PASS oauth:<Twitch OAuth token>\n< NICK <user>\n> :tmi.twitch.tv 001 <user> :Welcome, GLHF!\n> :tmi.twitch.tv 002 <user> :Your host is tmi.twitch.tv\n> :tmi.twitch.tv 003 <user> :This server is rather new\n> :tmi.twitch.tv 004 <user> :-\n> :tmi.twitch.tv 375 <user> :-\n> :tmi.twitch.tv 372 <user> :You are in a maze of twisty passages.\n> :tmi.twitch.tv 376 <user> :>\n
\n\n

About once every five minutes, the server will send you a PING :tmi.twitch.tv. To ensure that your connection to the server is not prematurely terminated, reply with PONG :tmi.twitch.tv.

\n\n

If your connection fails for any reason, you will be disconnected from the server. Common reasons for failed connections are:

\n\n\n\n

Re-Connecting to Twitch IRC

\n\n

To re-connect to Twitch, follow the same process. Best practice suggests trying again with exponential backoff (immediate, 1s, 2s, 4s, 8s).

\n\n

Known and Verified Bots

\n\n

There are two special statuses for bots which enhance the Twitch user experience and are trusted: known and verified. Both statuses provide elevated privileges. Verified bots have higher throughput than known bots. Verified status is granted only rarely.

\n\n

Both known and verified bots:

\n\n\n\n

To request known or verified bot status, please fill out the form at https://dev.twitch.tv/limit-increase as follows:

\n\n\n\n

After the form is reviewed, you will be emailed the results, typically within 3 business days.

\n\n

Command & Message Limits

\n\n

There are limits of the number of IRC commands or messages you are allowed to send to the server. If you exceed these limits, you are locked out of chat for 30 minutes.

\n\n

Authentication and join rate limits are:

\n\n\n\n

Command and message limits are:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
LimitApplies to
20 per 30 secondsUsers sending commands or messages to channels in which they do not have Moderator or Operator status
100 per 30 secondsUsers sending commands or messages to channels in which they have Moderator or Operator status
\n\n

For Whispers, which are private chat message between two users:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
LimitApplies to
3 per second, up to 100 per minute
40 accounts per day
Users (not bots)
10 per second, up to 200 per minute
500 accounts per day
Known bots
20 per second, up to 1200 per minute
100,000 accounts per day
Verified bots
\n\n

Invalid IRC Commands

\n\n

If you send an invalid command, you will get a 421 message back:

\n\n
< WHO #<channel>\n> :tmi.twitch.tv 421 <user> WHO :Unknown command\n
\n\n

Generic IRC Commands

\n\n

The Twitch API does not support WHO, part of the IRC specification.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CapabilityDescription
[JOIN](#join)Join a channel.
[PART](#part)Leave a channel.
[PRIVMSG](#privmsg)Send a message to a channel.
\n\n

JOIN

\n\n

Join a channel.

\n\n
< JOIN #<channel>\n> :<user>!<user>@<user>.tmi.twitch.tv JOIN #<channel>\n> :<user>.tmi.twitch.tv 353 <user> = #<channel> :<user>\n> :<user>.tmi.twitch.tv 366 <user> #<channel> :End of /NAMES list\n
\n\n

To receive commands related to the users in the channel  (JOIN, MODE, NAMES, and PART) after a successful JOIN, you must request the Twitch-specific Membership capability.

\n\n

If you try to join a suspended or deleted channel, you get a msg_channel_suspended NOTICE. If you try to join a nonexistent channel, the JOIN is quietly dropped.

\n\n

PART

\n\n

Leave a channel.

\n\n
< PART #<channel>\n> :<user>!<user>@<user>.tmi.twitch.tv PART #<channel>\n
\n\n

PRIVMSG

\n\n

Send a message to a channel.

\n\n
< PRIVMSG #<channel> :This is a sample message\n> :<user>!<user>@<user>.tmi.twitch.tv PRIVMSG #<channel> :This is a sample message\n
\n\n

Scopes for IRC Commands

\n\n

Twitch slash commands are sent via PRIVMSG. The following table lists these commands and required scopes.

\n\n
CommandRequired Scope

/ban, /unban

channel:moderate
/clearchannel:moderate
/colorchat:edit
/commercialchannel_commercial
/deletechannel:moderate
/disconnectchat:edit

/emoteonly, /emoteonlyoff

channel:moderate

/followers, /followersoff

channel:moderate
/helpchat:edit

/host, /unhost

channel_editor
/markerchannel_editor
/mechat:edit

/mod, /unmod

channel:moderate
/modschat:edit

/r9kbeta, /r9kbetaoff

channel:moderate

/raid, /unraid

channel_editor

/slow, /slowoff

channel:moderate

/subscribers, /subscribersoff

channel:moderate

/timeout, /untimeout

channel:moderate
/vip, /unvipchannel:moderate
/vipschat:edit
/wwhispers:edit
\n\n

Twitch IRC Capabilities

\n\n

Using IRC v3 capability registration, you can register for Twitch-specific capabilities, to access Twitch-specific commands, data, etc.

\n\n

Due to caching, events are not sent to a channel immediately; instead, they are batched and sent every 10 seconds.

\n\n

All elevated users are given operator privileges. To determine a user’s actual elevation level, request the tags capability and parse the user-type tag.

\n\n

There are several Twitch-specific capabilities:

\n\n\n","url":"/docs/irc/guide/","relative_path":"_docs/irc/guide.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Twitch IRC: Membership","parent_doc":"irc","order_number":3,"sub_menu_name":null,"slug":"membership","ext":".md","tags":[],"excerpt":"

Twitch IRC: Membership

\n","nav_count":0,"article_key":"membership","date":"2021-10-12 22:12:21 +0000","content":"

Twitch IRC: Membership

\n\n

Overview

\n\n

This guide explains the Twitch IRC channel membership capabilities. 

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CommandDescription
[JOIN](#join-twitch-membership)Join a channel.
[PART](#part-twitch-membership)Leave a channel.
\n\n

JOIN (Twitch Membership)

\n\n

Join a channel.

\n\n

Prototype

\n\n
> :<user>!<user>@<user>.tmi.twitch.tv JOIN #<channel>\n
\n\n

Example: ronni joined the dallas channel.

\n\n
> :ronni!ronni@ronni.tmi.twitch.tv JOIN #dallas\n
\n\n

PART (Twitch Membership)

\n\n

Leave a channel.

\n\n

Prototype

\n\n
> :<user>!<user>@<user>.tmi.twitch.tv PART #<channel>\n
\n\n

Example: ronni left the dallas channel.

\n\n
> :ronni!ronni@ronni.tmi.twitch.tv PART #dallas\n
\n","url":"/docs/irc/membership/","relative_path":"_docs/irc/membership.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Twitch IRC: msg-id Tags","parent_doc":"irc","order_number":7,"sub_menu_name":null,"slug":"msg-id","ext":".md","tags":[],"excerpt":"

Twitch IRC: msg-id Tags

\n","nav_count":0,"article_key":"msg-id","date":"2021-10-12 22:12:21 +0000","content":"

Twitch IRC: msg-id Tags

\n\n

msg-id Tags for NOTICE

\n\n

These tags apply to the NOTICE (Twitch Commands).

\n\n

For more information, see the Twitch help portal article on Chat Commands.

\n\n
msg-idMessage
already_banned<user> is already banned in this channel.
already_emote_only_offThis room is not in emote-only mode.
already_emote_only_onThis room is already in emote-only mode.
already_r9k_offThis room is not in r9k mode.
already_r9k_on

This room is already in r9k mode.

already_subs_offThis room is not in subscribers-only mode.
already_subs_onThis room is already in subscribers-only mode.
bad_ban_admin

You cannot ban admin <user>. Please email support@twitch.tv if an admin is being abusive.

bad_ban_anonYou cannot ban anonymous users.
bad_ban_broadcasterYou cannot ban the broadcaster.
bad_ban_global_mod

You cannot ban global moderator <user>. Please email support@twitch.tv if a global moderator is being abusive.

bad_ban_modYou cannot ban moderator <user> unless you are the owner of this channel.
bad_ban_selfYou cannot ban yourself.
bad_ban_staffYou cannot ban a staff <user>. Please email support@twitch.tv if a staff member is being abusive.
bad_commercial_error

Failed to start commercial.

bad_delete_message_broadcasterYou cannot delete the broadcaster's messages.
bad_delete_message_modYou cannot delete messages from another moderator <user>.
bad_host_error

There was a problem hosting <channel>. Please try again in a minute.

bad_host_hostingThis channel is already hosting <channel>.
bad_host_rate_exceededHost target cannot be changed more than <number> times every half hour.
bad_host_rejected

This channel is unable to be hosted.

bad_host_selfA channel cannot host itself.
bad_marker_clientSorry, /marker is not available through this client.
bad_mod_banned

<user> is banned in this channel. You must unban this user before granting mod status.

bad_mod_mod<user> is already a moderator of this channel.
bad_slow_durationYou cannot set slow delay to more than <number> seconds.
bad_timeout_admin

You cannot timeout admin <user>. Please email support@twitch.tv if an admin is being abusive.

bad_timeout_anonYou cannot timeout anonymous users.
bad_timeout_broadcasterYou cannot timeout the broadcaster.
bad_timeout_duration

You cannot time a user out for more than <seconds>.

bad_timeout_global_modYou cannot timeout global moderator <user>. Please email support@twitch.tv if a global moderator is being abusive.
bad_timeout_modYou cannot timeout moderator <user> unless you are the owner of this channel.
bad_timeout_self

You cannot timeout yourself.

bad_timeout_staffYou cannot timeout staff <user>. Please email support@twitch.tv if a staff member is being abusive.
bad_unban_no_ban

<user> is not banned from this channel.

bad_unhost_errorThere was a problem exiting host mode. Please try again in a minute.
bad_unmod_mod<user> is not a moderator of this channel.
ban_success

<user> is now banned from this channel.

cmds_availableCommands available to you in this room (use /help <command> for details): <list of commands>
color_changedYour color has been changed.
commercial_success

Initiating <number> second commercial break. Keep in mind that your stream is still live and not everyone will get a commercial.

delete_message_successThe message from <user> is now deleted.
emote_only_offThis room is no longer in emote-only mode.
emote_only_on

This room is now in emote-only mode.

followers_off

This room is no longer in followers-only mode.

Note: The followers tags are broadcast to a channel when a moderator makes changes.

followers_on

This room is now in <duration> followers-only mode.

Examples: “This room is now in 2 week followers-only mode.” or “This room is now in 1 minute followers-only mode.”

followers_onzero

This room is now in followers-only mode.

host_offExited host mode.
host_onNow hosting <channel>.
host_success

<user> is now hosting you.

host_success_viewers<user> is now hosting you for up to <number> viewers.
host_target_went_offline

<channel> has gone offline. Exiting host mode.

hosts_remaining<number> host commands remaining this half hour.
invalid_userInvalid username: <user>
mod_success

You have added <user> as a moderator of this channel.

msg_bannedYou are permanently banned from talking in <channel>.
msg_bad_charactersYour message was not sent because it contained too many characters that could not be processed. If you believe this is an error, rephrase and try again.
msg_channel_blocked

Your message was not sent because your account is not in good standing in this channel.

msg_channel_suspendedThis channel has been suspended.
msg_duplicateYour message was not sent because it is identical to the previous one you sent, less than 30 seconds ago.
msg_emoteonlyThis room is in emote only mode. You can find your currently available emoticons using the smiley in the chat text area.
msg_facebook

You must use Facebook Connect to send messages to this channel. You can see Facebook Connect in your Twitch settings under the connections tab.

msg_followersonly

This room is in <duration> followers-only mode. Follow <channel> to join the community!

Note: These msg_followers tags are kickbacks to a user who does not meet the criteria; that is, does not follow or has not followed long enough.

msg_followersonly_followedThis room is in <duration1> followers-only mode. You have been following for <duration2>. Continue following to chat!
msg_followersonly_zeroThis room is in followers-only mode. Follow <channel> to join the community!
msg_r9kThis room is in r9k mode and the message you attempted to send is not unique.
msg_ratelimitYour message was not sent because you are sending messages too quickly.
msg_rejectedHey! Your message is being checked by mods and has not been sent.
msg_rejected_mandatoryYour message wasn't posted due to conflicts with the channel's moderation settings.
msg_room_not_foundThe room was not found.
msg_slowmodeThis room is in slow mode and you are sending messages too quickly. You will be able to talk again in <number> seconds.
msg_subsonlyThis room is in subscribers only mode. To talk, purchase a channel subscription at https://www.twitch.tv/products/<broadcaster login name>/ticket?ref=subscriber_only_mode_chat.
msg_suspendedYour account has been suspended.
msg_timedoutYou are banned from talking in <channel> for <number> more seconds.
msg_verified_emailThis room requires a verified email address to chat. Please verify your email at https://www.twitch.tv/settings/profile.
no_helpNo help available.
no_modsThere are no moderators of this channel.
not_hostingNo channel is currently being hosted.
no_permissionYou don’t have permission to perform that action.
r9k_offThis room is no longer in r9k mode.
r9k_onThis room is now in r9k mode.
raid_error_already_raidingYou already have a raid in progress.
raid_error_forbiddenYou cannot raid this channel.
raid_error_selfA channel cannot raid itself.
raid_error_too_many_viewersSorry, you have more viewers than the maximum currently supported by raids right now.
raid_error_unexpectedThere was a problem raiding <channel>. Please try again in a minute.
raid_notice_matureThis channel is intended for mature audiences.
raid_notice_restricted_chatThis channel has follower or subscriber only chat.
room_modsThe moderators of this channel are: <list of users>
slow_offThis room is no longer in slow mode.
slow_onThis room is now in slow mode. You may send messages every <number> seconds.
subs_offThis room is no longer in subscribers-only mode.
subs_onThis room is now in subscribers-only mode.
timeout_no_timeout<user> is not timed out from this channel.
timeout_success<user> has been timed out for <duration> seconds.
tos_banThe community has closed channel <channel> due to Terms of Service violations.
turbo_only_colorOnly turbo users can specify an arbitrary hex color. Use one of the following instead: <list of colors>.
unban_success<user> is no longer banned from this channel.
unmod_successYou have removed <user> as a moderator of this channel.
unraid_error_no_active_raidYou do not have an active raid.
unraid_error_unexpectedThere was a problem stopping the raid. Please try again in a minute.
unraid_successThe raid has been cancelled.
unrecognized_cmdUnrecognized command: <command>
unsupported_chatrooms_cmdThe command <command> cannot be used in a chatroom.
untimeout_banned<user> is permanently banned. Use \"/unban\" to remove a ban.
untimeout_success<user> is no longer timed out in this channel.
usage_banUsage: “/ban <username> [reason]” Permanently prevent a user from chatting. Reason is optional and will be shown to the target and other moderators. Use “/unban” to remove a ban.
usage_clearUsage: “/clear”
Clear chat history for all users in this room.
usage_colorUsage: “/color” <color>
Change your username color. Color must be in hex (#000000) or one of the following: Blue, BlueViolet, CadetBlue, Chocolate, Coral, DodgerBlue, Firebrick, GoldenRod, Green, HotPink, OrangeRed, Red, SeaGreen, SpringGreen, YellowGreen.
usage_commercialUsage: “/commercial [length]”
Triggers a commercial. Length (optional) must be a positive number of seconds.
usage_disconnectUsage: “/disconnect”
Reconnects to chat.
usage_emote_only_offUsage: /emoteonlyoff”
Disables emote-only mode.
usage_emote_only_onUsage: “/emoteonly”
Enables emote-only mode (only emoticons may be used in chat). Use /emoteonlyoff to disable.
usage_followers_offUsage: /followersoff”
Disables followers-only mode.
usage_followers_onUsage: “/followers
Enables followers-only mode (only users who have followed for “duration” may chat). Examples: “30m”, “1 week”, “5 days 12 hours”. Must be less than 3 months.
usage_helpUsage: “/help”
Lists the commands available to you in this room.
usage_hostUsage: “/host <channel>”
Host another channel. Use “/unhost” to unset host mode.
usage_markerUsage: “/marker <optional comment>”
Adds a stream marker (with an optional comment, max 140 characters) at the current timestamp. You can use markers in the Highlighter for easier editing.
usage_meUsage: “/me <message>”
Send an “emote” message in the third person.
usage_modUsage: “/mod <username>”
Grant mod status to a user. Use “/mods” to list the moderators of this channel.
usage_modsUsage: “/mods”
Lists the moderators of this channel.
usage_r9k_offUsage: “/r9kbetaoff”
Disables r9k mode.
usage_r9k_onUsage: “/r9kbeta”
Enables r9k mode.
Use “/r9kbetaoff“ to disable.
usage_raidUsage: “/raid <channel>”
Raid another channel.
Use “/unraid” to cancel the Raid.
usage_slow_offUsage: “/slowoff”
Disables slow mode.
usage_slow_onUsage: “/slow” [duration]
Enables slow mode (limit how often users may send messages). Duration (optional, default=<number>) must be a positive integer number of seconds.
Use “/slowoff” to disable.
usage_subs_offUsage: “/subscribersoff”
Disables subscribers-only mode.
usage_subs_onUsage: “/subscribers”
Enables subscribers-only mode (only subscribers may chat in this channel).
Use “/subscribersoff” to disable.
usage_timeoutUsage: “/timeout <username> [duration][time unit] [reason]\"
Temporarily prevent a user from chatting. Duration (optional, default=10 minutes) must be a positive integer; time unit (optional, default=s) must be one of s, m, h, d, w; maximum duration is 2 weeks. Combinations like 1d2h are also allowed. Reason is optional and will be shown to the target user and other moderators.
Use “untimeout” to remove a timeout.
usage_unbanUsage: “/unban <username>”
Removes a ban on a user.
usage_unhostUsage: “/unhost”
Stop hosting another channel.
usage_unmodUsage: “/unmod <username>”
Revoke mod status from a user. Use “/mods” to list the moderators of this channel.
usage_unraidUsage: “/unraid”
Cancel the Raid.
usage_untimeoutUsage: “/untimeout <username>”
Removes a timeout on a user.
whisper_bannedYou have been banned from sending whispers.
whisper_banned_recipientThat user has been banned from receiving whispers.
whisper_invalid_argsUsage: <login> <message>
whisper_invalid_loginNo user matching that login.
whisper_invalid_selfYou cannot whisper to yourself.
whisper_limit_per_minYou are sending whispers too fast. Try again in a minute.
whisper_limit_per_secYou are sending whispers too fast. Try again in a second.
whisper_restrictedYour settings prevent you from sending this whisper.
whisper_restricted_recipientThat user's settings prevent them from receiving this whisper.
\n\n

 

\n","url":"/docs/irc/msg-id/","relative_path":"_docs/irc/msg-id.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Twitch IRC: Tags","parent_doc":"irc","order_number":5,"sub_menu_name":null,"slug":"tags","ext":".md","tags":[],"excerpt":"

Twitch IRC: Tags

\n","nav_count":0,"article_key":"tags","date":"2021-10-12 22:12:21 +0000","content":"

Twitch IRC: Tags

\n\n

Overview

\n\n

As stated in the IRCv3 Message Tag specification, “Message tags are a mechanism for adding additional metadata on a per-message basis. This is achieved via an extension to the protocol message format, enabled via capability negotiation. Tags are simple keys that MAY have optional string data as values.Tagged messages can be sent by both servers and clients. The usage of individual tags [is] specified in their own documents.”

\n\n

In other words, tags are optional metadata which Twitch can attach to an IRC message. When a client requests the tags capability, the EBS adds one or more tags to each message to that client.

\n\n

This guide documents the tags and values supported by Twitch IRC. If a tag is not documented here, it is not supported.

\n\n

Here is the general format for an individual tag:
> @tag-name=<tag-name> :tmi.twitch.tv <command> #<channel> :<user>

\n\n

Here is the general format for a set of tags:
@tag-name-1=<tag-value-1>;tag-name-2=<tag-value-2>;... <rest of the command syntax depends on the particular IRC command used>

\n\n

Tags may appear in any order. Write your code to parse tags individually and ignore unrecognized tags. 

\n\n

As noted in the following table, some tags are deprecated. 

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CommandDescription
CLEARCHATPurges all chat messages in a channel, or purges chat messages from a specific user, typically after a timeout or ban.
CLEARMSGRemoves a single message from a channel. This is triggered by /delete <target-msg-id> on IRC.
GLOBALUSERSTATEOn successful login, provides data about the current logged-in user through IRC tags. It is sent after successfully authenticating (sending a PASS/NICK command).
PRIVMSGSends a message to a channel.
ROOMSTATESends room-state data when a user joins a channel or a room setting is changed. For a join, the message contains all chat-room settings. For changes, only the relevant tag is sent.
USERNOTICESends a notice to the user when any of several events occurs.
USERSTATESends user-state data when a user joins a channel or sends a PRIVMSG to a channel.
\n\n

CLEARCHAT (Twitch Tags)

\n\n

Purges all chat messages in a channel, or purges chat messages from a specific user, typically after a timeout or ban.

\n\n

Prototype:

\n\n
> @ban-duration=<ban-duration> :tmi.twitch.tv CLEARCHAT #<channel> :<user>\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription
ban-duration(Optional) Duration of the timeout, in seconds. If omitted, the ban is permanent.
\n\n

Example: ronni is permanently banned from the dallas channel.

\n\n
> :tmi.twitch.tv CLEARCHAT #dallas :ronni\n
\n\n

CLEARMSG (Twitch Tags)

\n\n

Removes a single message from a channel. This is triggered by the/delete <target-msg-id> command on IRC.

\n\n

Prototype:

\n\n
> @login=<login>;target-msg-id=<target-msg-id> :tmi.twitch.tv CLEARMSG #<channel> :<message>\n
\n\n
ParameterDescription
loginName of the user who sent the message.
messageThe message.
target-msg-idUUID of the message.
\n\n

Example: ronni’s HeyGuys message is deleted from the dallas channel.

\n\n
> @login=ronni;target-msg-id=abc-123-def :tmi.twitch.tv CLEARMSG #dallas :HeyGuys\n
\n\n

GLOBALUSERSTATE (Twitch Tags)

\n\n

On successful login, provides data about the current logged-in user through IRC tags. It is sent after successfully authenticating (sending a PASS/NICK command).

\n\n

Prototype:
> @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emote-sets=<emote-sets>;turbo=<turbo>;user-id=<user-id>;user-type=<user-type> :tmi.twitch.tv GLOBALUSERSTATE

\n\n

Note: Before doing this, you must request and receive the tags capability:
< CAP REQ :twitch.tv/tags
> :tmi.twitch.tv CAP * ACK :twitch.tv/tags

\n\n

For more information, see Twitch IRC Capabilities.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription
badge-infoMetadata related to the chat badges in the badges tag.

Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.
badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
colorHexadecimal RGB color code; the empty string if it is never set.
display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
emote-setsA comma-separated list of emotes, belonging to one or more emote sets. This always contains at least 0. Get Chat Emoticons by Set gets a subset of emoticons.
turbo(Deprecated, use badges instead) 1 if the user has a Turbo badge; otherwise, 0.
user-idThe user’s ID.
user-type(Deprecated, use badges instead) The user’s type. Valid values: empty, mod, global_mod, admin, staff. The broadcaster can have any of these.
\n\n

Example: This is the global user state of dallas, an admin user, after logging in.

\n\n
> @badge-info=subscriber/8;badges=subscriber/6;color=#0D4200;display-name=dallas;emote-sets=0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239;turbo=0;user-id=1337;user-type=admin :tmi.twitch.tv GLOBALUSERSTATE\n
\n\n

PRIVMSG (Twitch Tags)

\n\n

Sends a message to a channel. 

\n\n

Prototype:

\n\n
> @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emotes=<emotes>;id=<id-of-msg>;mod=<mod>;room-id=<room-id>;subscriber=<subscriber>;tmi-sent-ts=<timestamp>;turbo=<turbo>;user-id=<user-id>;user-type=<user-type> :<user>!<user>@<user>.tmi.twitch.tv PRIVMSG #<channel> :<message>\n
\n\n

All PRIVMSGs contain the fields listed in the preceding prototype. In addition, the bits field is sent for Bits messages. To learn more about Bits, see the Extensions Monetization Guide

\n\n
ParameterDescription
badge-info

Metadata related to the chat badges in the badges tag.

Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.

badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
bitsSent only for Bits messages. The amount of cheer/Bits employed by the user. All instancess follow the regular expression:
/(^\\|\\s)<emote-name>\\d+(\\s\\|$)/
(where <emote-name> is an emote name returned by the Get Cheermotes endpoint), should be replaced with the appropriate emote:
static-cdn.jtvnw.net/bits/<theme>/<type>/<color>/<size>
  • themelight or dark
  • typeanimated or static
  • colorred for 10000+ Bits, blue for 5000-9999, green for 1000-4999, purple for 100-999, gray for 1-99
  • size – A digit between 1 and 4
colorHexadecimal RGB color code; the empty string if it is never set.
display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
emotesInformation to replace text in the message with emote images. This can be empty. Syntax:
<emote ID>:<first index>-<last index>,<another first index>-<another last index>/<another emote ID>:<first index>-<last index>...
  • emote ID – The number to use in this URL:
    http://static-cdn.jtvnw.net/emoticons/v1/:<emote ID>/:<size>
    (size is 1.0, 2.0 or 3.0.)
  • first index, last index – Character indexes. \\001ACTION does not count. Indexing starts from the first character that is part of the user’s actual message. See the example (normal message) below.
idA unique ID for the message.
messageThe message.
mod1 if the user has a moderator badge; otherwise, 0.
room-idThe channel ID.
subscriberDeprecated, use badges 
1 if the user has a subscriber badge; otherwise, 0.
tmi-sent-tsTimestamp when the server received the message.
turboDeprecated, use badges 
1 if the user has a Turbo badge; otherwise, 0.
user-idThe user’s ID.
user-typeDeprecated, use badges 
The user’s type. Valid values: mod, global_mod, admin, staff. If the broadcaster is not any of these user types, this field is left empty.
\n\n

Example of a non-Bits message: The first Kappa (emote ID 25) is from character 0 (K) to character 4 (a), and the other Kappa is from 12 to 16.

\n\n
> @badge-info=;badges=global_mod/1,turbo/1;color=#0D4200;display-name=ronni;emotes=25:0-4,12-16/1902:6-10;id=b34ccfc7-4977-403a-8a94-33c6bac34fb8;mod=0;room-id=1337;subscriber=0;tmi-sent-ts=1507246572675;turbo=1;user-id=1337;user-type=global_mod :ronni!ronni@ronni.tmi.twitch.tv PRIVMSG #ronni :Kappa Keepo Kappa\n
\n\n

Example of a Bits message: 

\n\n
> @badge-info=;badges=staff/1,bits/1000;bits=100;color=;display-name=ronni;emotes=;id=b34ccfc7-4977-403a-8a94-33c6bac34fb8;mod=0;room-id=1337;subscriber=0;tmi-sent-ts=1507246572675;turbo=1;user-id=1337;user-type=staff :ronni!ronni@ronni.tmi.twitch.tv PRIVMSG #ronni :cheer100\n
\n\n

ROOMSTATE (Twitch Tags)

\n\n

Sends room-state data when a user joins a channel or a room setting is changed. For a join, the message contains all chat-room settings. For changes, only the relevant tag is sent.

\n\n

Prototype:

\n\n
> @emote-only=<emote-only>;followers-only=<followers-only>;r9k=<r9k>;slow=<slow>;subs-only=<subs-only> :tmi.twitch.tv ROOMSTATE #<channel>\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription
emote-onlyEmote-only mode.
If enabled, only emotes are allowed in chat. Valid values: 0 (disabled) or 1 (enabled).
followers-onlyFollowers-only mode.
If enabled, controls which followers can chat. Valid values: -1 (disabled), 0 (all followers can chat), or a non-negative integer (only users following for at least the specified number of minutes can chat).
r9kR9K mode.
If enabled, messages with more than 9 characters must be unique. Valid values: 0 (disabled) or 1 (enabled).
slowThe number of seconds a chatter without moderator privileges must wait between sending messages.
subs-onlySubscribers-only mode.
If enabled, only subscribers and moderators can chat. Valid values: 0 (disabled) or 1 (enabled).
\n\n

Example: This is for a join in the dallas channel.

\n\n
> @emote-only=0;followers-only=0;r9k=0;slow=0;subs-only=0 :tmi.twitch.tv ROOMSTATE #dallas\n
\n\n

Example: On the dallas channel, slow mode is set to 10 seconds:

\n\n
> @slow=10 :tmi.twitch.tv ROOMSTATE #dallas\n
\n\n

USERNOTICE (Twitch Tags)

\n\n

Sends a notice to the user when any of the following events occurs:

\n\n\n\n

Prototype:

\n\n
> @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emotes=<emotes>;id=<id-of-msg>;login=<user>;mod=<mod>;msg-id=<msg-id>;room-id=<room-id>;subscriber=<subscriber>;system-msg=<system-msg>;tmi-sent-ts=<timestamp>;turbo=<turbo>;user-id=<user-id>;user-type=<user-type> :tmi.twitch.tv USERNOTICE #<channel> :<message>\n
\n\n

All USERNOTICEs contain the fields listed in the preceding prototype.

\n\n
ParameterDescription
badge-info

Metadata related to the chat badges in the badges tag.

Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.

badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
colorHexadecimal RGB color code; the empty string if it is never set.
display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
emotesInformation to replace text in the message with emote images. This can be empty. Syntax:
<emote ID>:<first index>-<last index>,<another first index>-<another last index>/<another emote ID>:<first index>-<last index>...
  • emote ID – The number to use in this URL:
    http://static-cdn.jtvnw.net/emoticons/v1/:<emote ID>/:<size>
    (size is 1.0, 2.0 or 3.0.)
  • first index, last index – Character indexes. \\001ACTION does not count. Indexing starts from the first character that is part of the user’s actual message. See the example (normal message) below.
idA unique ID for the message.
loginThe name of the user who sent the notice.
messageThe message.
This is omitted if the user did not enter a message.
mod1 if the user has a moderator badge; otherwise, 0.
msg-idThe type of notice (not the ID). Valid values: sub, resub, subgift, anonsubgift, submysterygift, giftpaidupgraderewardgift, anongiftpaidupgrade, raid, unraid, ritual, bitsbadgetier.
room-idThe channel ID.
subscriber(Deprecated, use badges)
1 if the user has a subscriber badge; otherwise, 0.
system-msgThe message printed in chat along with this notice.
tmi-sent-tsTimestamp when the server received the message.
turbo

(Deprecated, use badges)
1 if the user has a Turbo badge; otherwise, 0.

user-idThe user’s ID.
user-type(Deprecated, use badges)
The user’s type. Valid values: mod, global_mod, admin, staff. If the broadcaster is not any of these user types, this field is left empty.
\n\n

Several other, msg-param fields are sent only for some notices; e.g., sub/resub. See the table below for details.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
msg-param ParameterDescription
msg-param-cumulative-monthsSent only on sub, resub
The total number of months the user has subscribed. This is the same as msg-param-months but sent for different types of user notices.
msg-param-displayNameSent only on raid
The display name of the source user raiding this channel.
msg-param-loginSent on only raid
The name of the source user raiding this channel.
msg-param-monthsSent only on subgift, anonsubgift
The total number of months the user has subscribed. This is the same as msg-param-cumulative-months but sent for different types of user notices.
msg-param-promo-gift-totalSent only on anongiftpaidupgrade, giftpaidupgrade
The number of gifts the gifter has given during the promo indicated by msg-param-promo-name.
msg-param-promo-nameSent only on anongiftpaidupgrade, giftpaidupgrade
The subscriptions promo, if any, that is ongoing; e.g. Subtember 2018.
msg-param-recipient-display-nameSent only on subgift, anonsubgift
The display name of the subscription gift recipient.
msg-param-recipient-idSent only on subgift, anonsubgift
The user ID of the subscription gift recipient.
msg-param-recipient-user-nameSent only on subgift, anonsubgift
The user name of the subscription gift recipient.
msg-param-sender-loginSent only on giftpaidupgrade
The login of the user who gifted the subscription.
msg-param-sender-nameSent only on giftpaidupgrade
The display name of the user who gifted the subscription.
msg-param-should-share-streakSent only on sub, resub
Boolean indicating whether users want their streaks to be shared.
msg-param-streak-monthsSent only on sub, resub
The number of consecutive months the user has subscribed. This is 0 if msg-param-should-share-streak is 0.
msg-param-sub-plan(Sent only on subresub, subgift, anonsubgift) The type of subscription plan being used. Valid values: Prime, 1000, 2000, 3000. 1000, 2000, and 3000 refer to the first, second, and third levels of paid subscriptions, respectively (currently $4.99, $9.99, and $24.99).
msg-param-sub-plan-nameSent only on subresub, subgift, anonsubgift
The display name of the subscription plan. This may be a default name or one created by the channel owner.
msg-param-viewerCountSent only on raid
The number of viewers watching the source channel raiding this channel.
msg-param-ritual-nameSent only on ritual
The name of the ritual this notice is for. Valid value: new_chatter.
msg-param-thresholdSent only on bitsbadgetier
The tier of the bits badge the user just earned; e.g. 100, 1000, 10000.
msg-param-gift-monthsSent only on subgift, anonsubgift
Number of months gifted as part of a single, multi-month gift.
\n\n

Example: Notice sent when ronni resubscribed to the dallas channel.

\n\n
> @badge-info=;badges=staff/1,broadcaster/1,turbo/1;color=#008000;display-name=ronni;emotes=;id=db25007f-7a18-43eb-9379-80131e44d633;login=ronni;mod=0;msg-id=resub;msg-param-cumulative-months=6;msg-param-streak-months=2;msg-param-should-share-streak=1;msg-param-sub-plan=Prime;msg-param-sub-plan-name=Prime;room-id=1337;subscriber=1;system-msg=ronni\\shas\\ssubscribed\\sfor\\s6\\smonths!;tmi-sent-ts=1507246572675;turbo=1;user-id=1337;user-type=staff :tmi.twitch.tv USERNOTICE #dallas :Great stream -- keep it up!\n
\n\n

Example: Notice sent when tww2 gifted a subscription to Mr_Woodchuck in forstycup’s channel.

\n\n
> @badge-info=;badges=staff/1,premium/1;color=#0000FF;display-name=TWW2;emotes=;id=e9176cd8-5e22-4684-ad40-ce53c2561c5e;login=tww2;mod=0;msg-id=subgift;msg-param-months=1;msg-param-recipient-display-name=Mr_Woodchuck;msg-param-recipient-id=89614178;msg-param-recipient-name=mr_woodchuck;msg-param-sub-plan-name=House\\sof\\sNyoro~n;msg-param-sub-plan=1000;room-id=19571752;subscriber=0;system-msg=TWW2\\sgifted\\sa\\sTier\\s1\\ssub\\sto\\sMr_Woodchuck!;tmi-sent-ts=1521159445153;turbo=0;user-id=13405587;user-type=staff :tmi.twitch.tv USERNOTICE #forstycup\n
\n\n

Example: Notice sent when an anonymous user gifted a subscription to TenureCalculator in qa_subs_partner’s channel. This is like the “subgift” message above, except:

\n\n\n\n
> @badge-info=;badges=broadcaster/1,subscriber/6;color=;display-name=qa_subs_partner;emotes=;flags=;id=b1818e3c-0005-490f-ad0a-804957ddd760;login=qa_subs_partner;mod=0;msg-id=anonsubgift;msg-param-months=3;msg-param-recipient-display-name=TenureCalculator;msg-param-recipient-id=135054130;msg-param-recipient-user-name=tenurecalculator;msg-param-sub-plan-name=t111;msg-param-sub-plan=1000;room-id=196450059;subscriber=1;system-msg=An\\sanonymous\\suser\\sgifted\\sa\\sTier\\s1\\ssub\\sto\\sTenureCalculator!\\s;tmi-sent-ts=1542063432068;turbo=0;user-id=196450059;user-type= :tmi.twitch.tv USERNOTICE #qa_subs_partner\n
\n\n

Example: Notice sent when a channel is raided.

\n\n
> @badge-info=;badges=turbo/1;color=#9ACD32;display-name=TestChannel;emotes=;id=3d830f12-795c-447d-af3c-ea05e40fbddb;login=testchannel;mod=0;msg-id=raid;msg-param-displayName=TestChannel;msg-param-login=testchannel;msg-param-viewerCount=15;room-id=56379257;subscriber=0;system-msg=15\\sraiders\\sfrom\\sTestChannel\\shave\\sjoined\\n!;tmi-sent-ts=1507246572675;tmi-sent-ts=1507246572675;turbo=1;user-id=123456;user-type= :tmi.twitch.tv USERNOTICE #othertestchannel\n
\n\n

Example: Notice sent for a new_chatter ritual.

\n\n
> @badge-info=;badges=;color=;display-name=SevenTest1;emotes=30259:0-6;id=37feed0f-b9c7-4c3a-b475-21c6c6d21c3d;login=seventest1;mod=0;msg-id=ritual;msg-param-ritual-name=new_chatter;room-id=6316121;subscriber=0;system-msg=Seventoes\\sis\\snew\\shere!;tmi-sent-ts=1508363903826;turbo=0;user-id=131260580;user-type= :tmi.twitch.tv USERNOTICE #seventoes :HeyGuys\n
\n\n

USERSTATE (Twitch Tags)

\n\n

Sends user-state data when a user joins a channel or sends a PRIVMSG to a channel.

\n\n

Prototype:

\n\n
> @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emote-sets=<emote-sets>;mod=<mod>;subscriber=<subscriber>;turbo=<turbo>;user-type=<user-type>:tmi.twitch.tv USERSTATE #<channel>\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterDescription
badge-infoMetadata related to the chat badges in the badges tag.

Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.
badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
colorHexadecimal RGB color code; the empty string if it is never set.
display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
emote-setsYour emote set, a comma-separated list of emote sets. Get Chat Emoticons by Set gets a subset of emoticon images.
mod1 if the user has a moderator badge; otherwise, 0.
subscriber(Deprecated, use badges)
1 if the user has a subscriber badge; otherwise, 0.
turbo(Deprecated, use badges)
1 if the user has a Turbo badge; otherwise, 0.
user-type(Deprecated, use badges 
The user’s type. Valid values: empty, mod, global_mod, admin, staff. The broadcaster can have any of these.
\n\n

Example: Notice sent when ronni joins the dallas channel.

\n\n
> @badge-info=;badges=staff/1;color=#0D4200;display-name=ronni;emote-sets=0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239;mod=1;subscriber=1;turbo=1;user-type=staff :tmi.twitch.tv USERSTATE #dallas\n
\n","url":"/docs/irc/tags/","relative_path":"_docs/irc/tags.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Mobile Deep Links","sub_menu_name":null,"parent_doc":null,"order_number":1,"slug":"mobile-deeplinks","ext":".md","tags":[],"excerpt":"

Mobile Deep Links

\n","nav_count":0,"article_key":"mobile-deeplinks","date":"2021-10-12 22:12:21 +0000","content":"

Mobile Deep Links

\n\n

Introduction

\n\n

Deep links allow third party mobile apps and mobile web sites to bring users to a specific place within a Twitch app. This guide explains how to check whether the Twitch App is installed and describes deep link formats.

\n\n

Deep links are important because they allow tighter integration with Twitch on mobile apps. For example, an app that helps a broadcaster manage his channel could link directly to the user’s dashboard within the Twitch App (as opposed to just launching the app and leaving the user on the “Following” tab).

\n\n

You can find more information about deep links here. For support, visit the Twitch Developer Forums.

\n\n

Checking Whether the Twitch App is Installed

\n\n

You can check whether the Twitch App is already installed on a mobile device as follows:

\n\n

On iOS Objective C

\n\n
NSURL *twitchURL = [NSURL URLWithString:@\"twitch://open\"];\nif ([[UIApplication sharedApplication] canOpenURL:twitchURL]) {\n    // The Twitch app is installed, do whatever logic you need, and call -openURL:\n} else {\n    // The Twitch app is not installed. Prompt the user to install it!\n}\n
\n\n

On iOS Swift

\n\n

let twitchURL = NSURL(string: \"twitch://open\")
if (UIApplication.sharedApplication().canOpenURL(twitchURL!)) {
    // The Twitch app is installed, do whatever logic you need, and call -openURL:
} else {
    // The Twitch app is not installed. Prompt the user to install it!
}

\n\n

Note: On both iOS platforms, you also must change your app’s Info.plist file to declare that your app is allowed to query the twitch scheme. See the Apple documentation for detailed information. 

\n\n

On Android

\n\n
// Where “packagename” is the package name of the Twitch app:\nprivate boolean isPackageInstalled(String packagename, Context context) {\n    PackageManager pm = context.getPackageManager();\n    try {\n        pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);\n        return true;\n    } catch (NameNotFoundException e) {\n        return false;\n    }\n}\n
\n\n\n\n

To launch the Twitch App, use twitch://open.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
To launch the Twitch App and…Use this URL
Navigate to a specific channeltwitch://stream/<channel name>
– OR –
twitch://open?stream=<channel name>
Open a specific game directorytwitch://game/<game name>
– OR –
twitch://open?game=<game name>
Open a specific VODtwitch://video/<video ID>
– OR –
twitch://open?video=<video ID>

For a VOD with this URL:
twitch.tv/some_channel/v/1234567
the video_id is v1234567.
Open a specific channel activity feed (includes VODs)twitch://channel/<channel name>
– OR –
twitch://open?channel=<channel name>
Open the user’s “following” directory
(first tab in the app)
twitch://following
If the user is not logged in, this goes to the login page
Open the login pagetwitch://login
Open a specific chat roomtwitch://<channel name>/rooms/<room name>
View a specific Category tagtwitch://directory/tags/<tag ID>
Open a specific live-stream tagtwitch://directory/all/tags/<tag ID>
Broadcast a specific gametwitch://broadcast?game_id=<game ID>
\n\n

 

\n\n


 

\n","url":"/docs/mobile-deeplinks/","relative_path":"_docs/mobile-deeplinks.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Petstore API","sub_menu_name":"Get Started","parent_doc":null,"order_number":2,"slug":"petstore","ext":".md","tags":[],"excerpt":"

Petstore API

\n","nav_count":0,"article_key":"petstore","date":"2021-10-12 22:12:21 +0000","content":"

Petstore API

\n\n

The references under this section have been automatically generated from the OpenAPI spec located at _data/petstore.json.

\n\n

Introduction

\n\n

Welcome to our new API!

\n\n

Making Requests

\n\n

This is another placeholder section just to demonstrate the generated left-hand navigation.

\n\n

References

\n\n","url":"/docs/petstore/","relative_path":"_docs/petstore.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Product Lifecycle","sub_menu_name":null,"parent_doc":null,"order_number":1,"disable_anchor_links":true,"slug":"product-lifecycle","ext":".md","tags":[],"excerpt":"

Product Lifecycle

\n","nav_count":0,"article_key":"product-lifecycle","date":"2021-10-12 22:12:21 +0000","content":"

Product Lifecycle

\n\n

This page provides the current lifecycle status of our developer products and services. For real-time availability and latency status, see devstatus.twitch.tv.

\n\n

Important Dates

\n\n\n\n

API Endpoint and Subscription Classifications

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TagDescription
NEWFunctionality that has been recenty released.
BETAFunctionality that is considered to be in public beta and not intended for use in production environments. All aspects of this functionality including query parameters and response structure are subject to change without notice. While exploring this functionality, please provide your feedback in the UserVoice Developer Forum.
\n\n

Product Status Definitions

\n\n

Developer products and services can be in one of the three statuses. This table provides context for the availability of a product or service given its current status.

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
StatusAvailabilityMaintenanceNotification
ActiveLive in production.Actively maintained with bug and security fixes. New features may be added.An announcement is posted when a new product or product feature is available. Changelog is updated.
DeprecatedLive in production.Only major bug and security fixes are made. New features are not added.An announcement is posted when a product or product feature is deprecated. Direct emails may be sent to developers. Changelog is updated. Decommission and shutdown plan will be announced at time of deprecation or at a later date.
DecommissionedNo longer available in production.Service is no longer maintained.Previous announcements may be updated. Further announcements and emails are possible.
\n\n

Current Product Status

\n\n

Active

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProductRelated Announcements
Authentication: OIDC tokens 
Authentication: User access tokens 
Authentication: App access tokens 
Chat (IRC) 
DropsRead more about the latest version
Embedding Twitch: EverythingSee 2020 updates
Embedding Twitch: ChatSee 2020 updates
Embedding Twitch: Video & ClipsSee 2020 updates
Extensions 
Insights & Analytics 
Mobile Deep Links 
Pubsub 
Twitch API: HelixOAuth requirements
\n\n

Deprecated

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProductNote
Twitch API: v5 
Legacy DropsDrops campaigns that use VHS endpoints. Read more in the announcement.
\n\n

Decommissioned

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ProductNote
Chat roomsDecommissioned in January 2020
Twitch API: v3Decommissioned on September 12, 2019
\n","url":"/docs/product-lifecycle/","relative_path":"_docs/product-lifecycle.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"PubSub","sub_menu_name":null,"parent_doc":null,"order_number":1,"slug":"pubsub","ext":".md","tags":[],"excerpt":"

PubSub Guide

\n","nav_count":0,"article_key":"pubsub","date":"2021-10-12 22:12:21 +0000","content":"

PubSub Guide

\n\n

Introduction

\n\n

PubSub enables you to subscribe to a topic, for updates (e.g., when a user cheers in a channel).

\n\n

The Twitch PubSub system allows back-end services to broadcast realtime messages to clients. Example applications include:

\n\n\n\n

These example applications share a common pattern: on application load, the application fetches a complete snapshot of its state and uses a PubSub connection to receive updates to this state. The updates act as “diffs” to the initial state.

\n\n

Clients establish a WebSocket connection to our server, listen on topics they care about, and get messages on those topics in real time. Each command or message sent between the client and server is a JSON string encapsulated in one WebSocket frame.

\n\n

WebSocket is a communications protocol, providing full-duplex communication channels over a single TCP connection. For more information, see the WebSocket Wikipedia entry.

\n\n

The JSON messages differ, depending on the type of message or command, but typically they have this form:

\n\n
{\n   \"type\": \"<type string>\",\n   \"data\": \"<JSON blob>\"\n}\n
\n\n

A code sample is available for JavaScript.

\n\n

Terminology

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
TermDefinition
ClientAn end-user session of the Twitch application or a third-party application’s integration point.
CommandAn action that a client issues to the server, which modifies the state of the client connection.
MessageA piece of data which back-end services broadcast to interested clients via PubSub. PubSub never inspects or mutates messages.
ServerA Twitch machine that clients connect to for PubSub service.
TopicAka event. A logical partition of messages that clients may subscribe to, to get messages.
\n\n

Connection Management

\n\n

Clients establish a secure WebSocket connection to:

\n\n

wss://pubsub-edge.twitch.tv

\n\n

To keep the server from closing the connection, clients must send a PING command at least once every 5 minutes. If a client does not receive a PONG message within 10 seconds of issuing a PING command, it should reconnect to the server. See details in Handling Connection Failures.

\n\n

Clients must LISTEN on at least one topic within 15 seconds of establishing the connection, or they will be disconnected by the server.

\n\n

Clients may receive a RECONNECT message at any time. This indicates that the server is about to restart (typically for maintenance) and will disconnect the client within 30 seconds. During this time, we recommend that clients reconnect to the server; otherwise, the client will be forcibly disconnected.

\n\n

Example: PING Connection Message

\n\n
// Sent from client to server\n{\n  \"type\": \"PING\"\n}\n
\n\n

Example: PONG Connection Message

\n\n
// Sent from server to client in response to a PING\n{\n  \"type\": \"PONG\"\n}\n
\n\n

Example: RECONNECT Connection Message

\n\n
// Sent from server to client\n{\n  \"type\": \"RECONNECT\"\n}\n
\n\n

Handling Connection Failures

\n\n

When a client encounters a situation where it must reconnect to the server, it should first establish a new successful WebSocket connection and then issue a LISTEN command that contains the set of topics that the application expects to receive messages on.

\n\n

If a client fails to connect to the server or is disconnected from the server, it should reconnect to the server using an exponential backoff. Our official client implementation initially waits one second (plus a small random jitter: see the next paragraph) to retry a failed connection and doubles the backoff period on subsequent failures, up to a maximum backoff threshold of 2 minutes. This prevents some “stampeding herd” situations where many clients simultaneously connect to the server.

\n\n

If a client uses timers to issue PING commands, it should add a small random jitter to the timer. This prevents some situations where many clients issue PING commands simultaneously.

\n\n

After a client reconnects to the server, some applications should fetch fresh state, to compensate for any missed messages while the connection was broken. For instance, our Chat application fetches the Bits leaderboard on reconnect (as it does on initial page load), in case the leaderboard received an update while the connection was down.

\n\n

API Limits

\n\n\n\n

The two limits above are likely to be relaxed for approved third-party applications, as we start to better understand third-party requirements.

\n\n\n\n

Topics

\n\n

Once a client establishes a connection, it can LISTEN on topics it cares about. Clients can LISTEN on many topics at once and add new topics at any time by issuing new LISTEN commands.

\n\n

Once a client no longer cares about a particular set of topics, it should issue UNLISTEN commands to stop receiving messages on those topics.

\n\n

Authentication

\n\n

All topics require an OAuth token, but only some topics have a specific required scope (noted in the table below).

\n\n

Available Topics

\n\n

All topics require an OAuth token, but only some topics have a specific required scope (noted in the table).

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FeatureTopic and ExampleRequired ScopeYou are notified when…
Bitschannel-bits-events-v1.<channel ID>

Example:
channel-bits-events-v1.44322889
bits:readAnyone cheers in a specified channel.
Bitschannel-bits-events-v2.<channelID>

Example:
channel-bits-events-v2.4602499
bits:readAnyone cheers in a specified channel.
Bits Badge Notificationchannel-bits-badge-unlocks.<channel_id>

Example:
channel-bits-badge-unlocks.44322889
bits:readMessage sent when a user earns a new Bits badge in a particular channel, and chooses to share the notification with chat.
Channel Pointschannel-points-channel-v1.<channel_id>

Example:
channel-points-channel-v1.44322889
channel:read:redemptionsA custom reward is redeemed in a channel.
Channel Subscriptionschannel-subscribe-events-v1.<channel ID>

Example:
channel-subscribe-events-v1.44322889
channel_subscriptionsAnyone subscribes (first month), resubscribes (subsequent months), or gifts a subscription to a channel. 

Subgift subscription messages contain recipient information.
Chatchat_moderator_actions.<user ID>.<channel ID>

Example: chat_moderator_actions.46024993.44322889
channel:moderateSupports moderators listening to the topic, as well as users listening to the topic to receive their own events. 

Examples of moderator actions are bans, unbans, timeouts, deleting messages, changing chat mode (followers-only, subs-only), changing AutoMod levels, and adding a mod.
Whisperswhispers.<user ID>

Example:
whispers.44322889
whispers:readAnyone whispers the specified user.
\n\n

Where:

\n\n\n\n

Note: channel-bitsevents is deprecated. For Bits events, use channel-bits-events-v2 instead.

\n\n

Note: channel-commerce-events-v1.<channel id> is deprecated.

\n\n

Requests

\n\n

This is an example request for Bits events. It listens to Bits events on channel 44322889. The authorization scope is specified when you generate the OAuth token using our authorization flow; see the Apps & Authentication Guide.

\n\n
// Request from client to server\n{\n  \"type\": \"LISTEN\",\n  \"nonce\": \"44h1k13746815ab1r2\",\n  \"data\": {\n    \"topics\": [\"channel-bits-events-v1.44322889\"],\n    \"auth_token\": \"cfabdegwdoklmawdzdo98xt2fo512y\"\n  }\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Request ParameterTypeDescription
typestringValid values: LISTEN, UNLISTEN.
noncestring(Optional) Random string to identify the response associated with this request.
dataJSONWraps the topics and auth_token fields.
topicsarray of stringsList of topics to listen on. Valid values are any of the topics listed in Available Topics.
auth_tokenstringOAuth token required to listen on some topics. The token is linked to either the specified <channel user ID> (for Bits events) or the specified <user ID> (for whispers events).
\n\n

Responses

\n\n

Here is a sample response:

\n\n
// Response from server to client\n{\n  \"type\": \"RESPONSE\",\n  \"nonce\": \"44h1k13746815ab1r2\",\n  \"error\": \"\"\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FieldTypeDescription
typestringValid value: RESPONSE.
noncestringThe nonce that was passed in the request, if one was provided there.
errorstringThe error message associated with the request, or an empty string if there is no error.

For Bits and whispers events requests, error responses can be: ERR_BADMESSAGE, ERR_BADAUTH, ERR_SERVER, ERR_BADTOPIC.
\n\n

Receiving Messages

\n\n

When a message for your subscription is published, you will receive a message containing the applicable data.

\n\n

Message Parameters: All Messages

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ParameterTypeDescription
typestringValid value: MESSAGE
dataJSONWraps the topics and message fields.
topicstringThe topic that the message pertains to.
messagestringThe body of the message. Depending on the type of message, the message body contains different fields; see below.
\n\n

Example: Bits Event v2 Message

\n\n
{\n  \"type\": \"MESSAGE\",\n  \"data\": {\n     \"topic\": \"channel-bits-events-v2.46024993\",\n     \"message\": \"{\\\"data\\\":{\\\"user_name\\\":\\\"jwp\\\",\\\"channel_name\\\":\\\"bontakun\\\",\\\"user_id\\\":\\\"95546976\\\",\\\"channel_id\\\":\\\"46024993\\\",\\\"time\\\":\\\"2017-02-09T13:23:58.168Z\\\",\\\"chat_message\\\":\\\"cheer10000 New badge hype!\\\",\\\"bits_used\\\":10000,\\\"total_bits_used\\\":25000,\\\"context\\\":\\\"cheer\\\",\\\"badge_entitlement\\\":{\\\"new_version\\\":25000,\\\"previous_version\\\":10000}},\\\"version\\\":\\\"1.0\\\",\\\"message_type\\\":\\\"bits_event\\\",\\\"message_id\\\":\\\"8145728a4-35f0-4cf7-9dc0-f2ef24de1eb6\\\",\\\"is_anonymous\\\":true}\"\n  }\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FieldTypeDescription
badge_entitlement
(optional)
object Information about a user’s new badge level, if the cheer was not anonymous and the user reached a new badge level with this cheer. Otherwise, null.
bits_usedintegerNumber of bits used.
channel_idstringID of the channel in which Bits were used.
chat_messagestringChat message sent with the cheer.
contextstringEvent type associated with this use of Bits.
is_anonymousBooleanWhether or not the event was anonymous.
message_idstringMessage ID.
message_typestringThe type of object contained in the data field.
timestringTime when the Bits were used.
RFC 3339 format.
total_bits_usedintegerAll time total number of Bits used in the channel by a specified user.
user_id 
(optional)
stringUser ID of the person who used the Bits - if the cheer was not anonymous.
Null if anonymous.
user_name
(optional)
stringLogin name of the person who used the Bits - if the cheer was not anonymous. 
Null if anonymous
versionstringMessage version
\n\n

Example: Bits Event v1 Message

\n\n
{\n   \"type\": \"MESSAGE\",\n   \"data\": {\n      \"topic\": \"channel-bits-events-v1.44322889\",\n      \"message\": \"{\\\"data\\\":{\\\"user_name\\\":\\\"dallasnchains\\\",\\\"channel_name\\\":\\\"dallas\\\",\\\"user_id\\\":\\\"129454141\\\",\\\"channel_id\\\":\\\"44322889\\\",\\\"time\\\":\\\"2017-02-09T13:23:58.168Z\\\",\\\"chat_message\\\":\\\"cheer10000 New badge hype!\\\",\\\"bits_used\\\":10000,\\\"total_bits_used\\\":25000,\\\"context\\\":\\\"cheer\\\",\\\"badge_entitlement\\\":{\\\"new_version\\\":25000,\\\"previous_version\\\":10000}},\\\"version\\\":\\\"1.0\\\",\\\"message_type\\\":\\\"bits_event\\\",\\\"message_id\\\":\\\"8145728a4-35f0-4cf7-9dc0-f2ef24de1eb6\\\"}\"\n   }\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FieldTypeDescription
badge_entitlementobjectInformation about the user’s new badge level, if the user reached a new badge level with this cheer; otherwise. null.
bits_usedintegerNumber of Bits used.
channel_idstringUser ID of the channel on which Bits were used.
channel_namestringName of the channel on which Bits were used.
chat_messagestringChat message sent with the cheer.
contextstringEvent type associated with this use of Bits (for example, cheer).
message_idstringMessage ID
message_typestringMessage type (that is, the type of object contained in the data field)
timestringTime when the Bits were used. RFC 3339 format.
total_bits_usedintegerAll-time total number of Bits used on this channel by the specified user.
user_idstringUser ID of the person who used the Bits.
user_namestringLogin name of the person who used the Bits.
versionstringMessage version
\n\n

Example: Bits Badge Notification Message

\n\n
{\n     \"type\":\"MESSAGE\",\"data\":{\"topic\":\"channel-bits-badge-unlocks.401394874\",\"message\":\"\n     {\n          \\\"user_id\\\":\\\"232889822\\\",\\\"user_name\\\":\\\"willowolf\\\",\\\"channel_id\\\":\\\"401394874\\\",\\\"channel_name\\\":\\\"fun_test12345\\\",\\\"badge_tier\\\":1000,\\\"chat_message\\\":\\\"this should be received by the public pubsub listener\\\",\\\"time\\\":\\\"2020-12-06T00:01:43.71253159Z\\\"}\"\n     }\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FieldTypeDescription
user_idstringID of user who earned the new Bits badge
user_namestringLogin of user who earned the new Bits badge
channel_idstringID of channel where user earned the new Bits badge
channel_namestringLogin of channel where user earned the new Bits badge
badge_tierintegerValue of Bits badge tier that was earned (1000, 10000, etc.)
chat_messagestring[Optional] Custom message included with share
timestringTime when the new Bits badge was earned.
RFC 3339 format.
\n\n

Example: Channel Points Event Message

\n\n
{\n\"type\": \"reward-redeemed\",\n\"data\": {\n  \"timestamp\": \"2019-11-12T01:29:34.98329743Z\",\n  \"redemption\": {\n    \"id\": \"9203c6f0-51b6-4d1d-a9ae-8eafdb0d6d47\",\n    \"user\": {\n      \"id\": \"30515034\",\n      \"login\": \"davethecust\",\n      \"display_name\": \"davethecust\"\n    },\n    \"channel_id\": \"30515034\",\n    \"redeemed_at\": \"2019-12-11T18:52:53.128421623Z\",\n    \"reward\": {\n      \"id\": \"6ef17bb2-e5ae-432e-8b3f-5ac4dd774668\",\n      \"channel_id\": \"30515034\",\n      \"title\": \"hit a gleesh walk on stream\",\n      \"prompt\": \"cleanside's finest \\n\",\n      \"cost\": 10,\n      \"is_user_input_required\": true,\n      \"is_sub_only\": false,\n      \"image\": {\n        \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/30515034/6ef17bb2-e5ae-432e-8b3f-5ac4dd774668/7bcd9ca8-da17-42c9-800a-2f08832e5d4b/custom-1.png\",\n        \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/30515034/6ef17bb2-e5ae-432e-8b3f-5ac4dd774668/7bcd9ca8-da17-42c9-800a-2f08832e5d4b/custom-2.png\",\n        \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/30515034/6ef17bb2-e5ae-432e-8b3f-5ac4dd774668/7bcd9ca8-da17-42c9-800a-2f08832e5d4b/custom-4.png\"\n      },\n      \"default_image\": {\n        \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n        \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n        \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n      },\n      \"background_color\": \"#00C7AC\",\n      \"is_enabled\": true,\n      \"is_paused\": false,\n      \"is_in_stock\": true,\n      \"max_per_stream\": { \"is_enabled\": false, \"max_per_stream\": 0 },\n      \"should_redemptions_skip_request_queue\": true\n    },\n    \"user_input\": \"yeooo\",\n    \"status\": \"FULFILLED\"\n    }\n  }\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FieldTypeDescription
timestampstringTime the pubsub message was sent
redemptionobjectData about the redemption, includes unique id and user that redeemed it
channel_idstringID of the channel in which the reward was redeemed.
redeemed_atstringTimestamp in which a reward was redeemed
rewardobjectData about the reward that was redeemed
user_input
(optional)
stringA string that the user entered if the reward requires input
statusstringreward redemption status, will be FULFULLED if a user skips the reward queue, UNFULFILLED otherwise
\n\n

Example: Channel Subscriptions Event Message

\n\n

The data field is a JSON object that contains topic and message fields. Typically, message is a JSON object that has been escaped (see “Example: Bits Event Message”) and cast into a string.

\n\n

Note: The months field is deprecated. We now have fields for cumulative-months and streak-months.

\n\n

Following is an example of a sub/resub message:

\n\n
{\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"user_name\": \"tww2\",\n      \"display_name\": \"TWW2\",\n      \"channel_name\": \"mr_woodchuck\",\n      \"user_id\": \"13405587\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"cumulative_months\": 9,\n      \"streak_months\": 3,\n      \"context\": \"resub\",\n      \"is_gift\": false,\n      \"sub_message\": {\n        \"message\": \"A Twitch baby is born! KappaHD\",\n        \"emotes\": [\n          {\n            \"start\": 23,\n            \"end\": 7,\n            \"id\": 2867\n          }\n        ]\n      }\n    }\n  }\n}\n
\n\n

Here is an example of a subgift message, which contains recipient information.

\n\n
{\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"user_name\": \"tww2\",\n      \"display_name\": \"TWW2\",\n      \"channel_name\": \"mr_woodchuck\",\n      \"user_id\": \"13405587\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"months\": 9,\n      \"context\": \"subgift\",\n      \"is_gift\": true,\n      \"sub_message\": {\n        \"message\": \"\",\n        \"emotes\": null\n      },\n      \"recipient_id\": \"19571752\",\n      \"recipient_user_name\": \"forstycup\",\n      \"recipient_display_name\": \"forstycup\"\n    }\n  }\n}\n
\n\n

Here is an example of a multi-month subgift message, which contains recipient information as well as the number of months gifted.

\n\n
{\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"user_name\": \"tww2\",\n      \"display_name\": \"TWW2\",\n      \"channel_name\": \"mr_woodchuck\",\n      \"user_id\": \"13405587\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"months\": 9,\n      \"context\": \"subgift\",\n      \"is_gift\": true,\n      \"sub_message\": {\n        \"message\": \"\",\n        \"emotes\": null\n      },\n      \"recipient_id\": \"19571752\",\n      \"recipient_user_name\": \"forstycup\",\n      \"recipient_display_name\": \"forstycup\",\n      \"multi_month_duration\": 6\n    }\n  }\n}\n
\n\n

Here is an example of an anonsubgift message. This is like subgift but contains no sender information, since the gifter is anonymous.

\n\n
{\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"channel_name\": \"mr_woodchuck\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"months\": 9,\n      \"context\": \"anonsubgift\",\n      \"is_gift\": true,\n      \"sub_message\": {\n        \"message\": \"\",\n        \"emotes\": null\n      },\n      \"recipient_id\": \"13405587\",\n      \"recipient_user_name\": \"tww2\",\n      \"recipient_display_name\": \"TWW2\"\n    }\n  }\n}\n
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
FieldTypeDescription
channel_idstringID of the channel that has been subscribed or subgifted
channel_namestringName of the channel that has been subscribed or subgifted
contextstringEvent type associated with the subscription product, values: sub, resub, subgift, anonsubgift, resubgift, anonresubgift
dataJSONWraps the topics and message fields
user_idstringUser ID of the person who subscribed or sent a gift subscription
user_namestringLogin name of the person who subscribed or sent a gift subscription
display_namestringDisplay name of the person who subscribed or sent a gift subscription
messagestringThe body of the user-entered resub message. Depending on the type of message, the message body contains different fields
monthsintCumulative number of months the gifter has giften in the channel (Deprecated)
recipient_idstringUser ID of the subscription gift recipient
recipient_user_namestringLogin name of the subscription gift recipient
recipient_display_namestringDisplay name of the person who received the subscription gift
sub_planstringSubscription Plan ID, values: Prime, 1000, 2000, 3000
sub_plan_namestringChannel Specific Subscription Plan Name
timestringTime when the subscription or gift was completed. RFC 3339 format
topicstringThe topic that the message pertains to
typestringValid value: MESSAGE
cumulative_monthsstringCumulative number of tenure months of the subscription
streak_monthsstringDenotes the user’s most recent (and contiguous) subscription tenure streak in the channel
is_giftboolIf this sub message was caused by a gift subscription
multi_month_durationintNumber of months gifted as part of a single, multi-month gift OR number of months purchased as part of a multi-month subscription
\n\n

Example: Whispers Event Message

\n\n

The data field is a JSON object that contains topic and message fields. Typically, message is a JSON object that has been escaped (see “Example: Bits Event Message” above) and cast into a string.

\n\n
{\n  \"type\":\"MESSAGE\",\n  \"data\":{\n     \"topic\":\"whispers.44322889\",\n     \"message\":{\n        \"type\":\"whisper_received\",\n        \"data\":{\n           \"id\":41\n        },\n        \"thread_id\":\"129454141_44322889\",\n        \"body\":\"hello\",\n        \"sent_ts\":1479160009,\n        \"from_id\":39141793,\n        \"tags\":{\n           \"login\":\"dallas\",\n           \"display_name\":\"dallas\",\n           \"color\":\"#8A2BE2\",\n           \"emotes\":[\n\n           ],\n           \"badges\":[\n              {\n                 \"id\":\"staff\",\n                 \"version\":\"1\"\n              }\n           ]\n        },\n        \"recipient\":{\n           \"id\":129454141,\n           \"username\":\"dallasnchains\",\n           \"display_name\":\"dallasnchains\",\n           \"color\":\"\",\n           \"badges\":[]\n        },\n        \"nonce\":\"6GVBTfBXNj7d71BULYKjpiKapegDI1\"\n     },\n     \"data_object\":{\n        \"id\":41,\n        \"thread_id\":\"129454141_44322889\",\n        \"body\":\"hello\",\n        \"sent_ts\":1479160009,\n        \"from_id\":44322889,\n        \"tags\":{\n           \"login\":\"dallas\",\n           \"display_name\":\"dallas\",\n           \"color\":\"#8A2BE2\",\n           \"emotes\":[],\n           \"badges\":[\n              {\n                 \"id\":\"staff\",\n                 \"version\":\"1\"\n              }\n           ]\n        },\n        \"recipient\":{\n           \"id\":129454141,\n           \"username\":\"dallasnchains\",\n           \"display_name\":\"dallasnchains\",\n           \"color\":\"\",\n           \"badges\":[]\n        },\n        \"nonce\":\"6GVBTfBXNj7d71BULYKjpiKapegDI1\"\n     }\n  }\n}\n
\n\n

The fields in this message are similar to IRC fields. See the Chatbots and IRC documentation.

\n\n

Example: Multi-month Subscription Message

\n\n

Here is an example of a multi-month subscription message. This message is published upon purchase, auto-renewal, or re-subscription for a multi-month, recurring subscription

\n\n
 {\n   \"type\": \"MESSAGE\",\n   \"data\": {\n     \"topic\": \"channel-subscribe-events-v1.44322889\",\n     \"message\": {\n       \"user_name\": \"tww2\",\n       \"display_name\": \"TWW2\",\n       \"channel_name\": \"mr_woodchuck\",\n       \"user_id\": \"13405587\",\n       \"channel_id\": \"89614178\",\n       \"time\": \"2015-12-19T16:39:57-08:00\",\n       \"sub_plan\": \"1000\",\n       \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n       \"months\": 4,\n       \"context\": \"sub\",\n       \"is_gift\": false,\n       \"sub_message\": {\n         \"message\": \"\",\n         \"emotes\": null\n       },\n       \"recipient_id\": \"19571752\",\n       \"recipient_user_name\": \"forstycup\",\n       \"recipient_display_name\": \"forstycup\",\n       \"multi_month_duration\": 6\n     }\n }\n
\n","url":"/docs/pubsub/","relative_path":"_docs/pubsub.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Legacy Twitch API v5","sub_menu_name":null,"parent_doc":null,"order_number":1,"slug":"v5","ext":".md","tags":[],"excerpt":"

Using the Legacy Twitch API v5

\n","nav_count":0,"article_key":"v5","date":"2021-10-12 22:12:21 +0000","content":"

Using the Legacy Twitch API v5

\n\n

Introduction

\n\n

This guide covers:

\n\n\n\n

Getting a client ID

\n\n

To identify your application to the API, every request must include your application’s client ID, either explicitly or implicitly by including an OAuth token. If you use an OAuth token in your request, the API figures out the client ID for you.

\n\n

Requests can include both a client ID and an OAuth token. Requests without either one fail with an HTTP 400 error.

\n\n

To get a client ID, register your application on the Twitch developer portal. Once you have your client ID, you can send it via:

\n\n\n\n

Requests

\n\n

For client IDs created on or after May 31, 2019, the only available version of the Legacy Twitch API is v5.  For client IDs created prior to May 31, 2019, use the Accept: application/vnd.twitchtv.v5+json header on your requests to access v5 of the Legacy Twitch API API.

\n\n

Translating from user names to user IDs

\n\n

Legacy Twitch API v5 APIs use user IDs, whereas older versions of the APIs used user names. To translate from a user name to a user ID, use the Get Users endpoint with up to 100 logins:

\n\n
curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X GET https://api.twitch.tv/kraken/users?login=dallas,dallasnchains\n
\n\n

The response is a JSON blob that contains the user objects for the specified users:

\n\n
{\n   \"_total\": 2,\n   \"users\": [\n      {\n         \"_id\": \"44322889\",\n         \"bio\": \"Just a gamer playing games and chatting. :)\",\n         \"created_at\": \"2013-06-03T19:12:02.580593Z\",\n         \"display_name\": \"dallas\",\n         \"logo\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-profile_image-1a2c906ee2c35f12-300x300.png\",\n         \"name\": \"dallas\",\n         \"type\": \"staff\",\n         \"updated_at\": \"2017-02-09T16:32:06.784398Z\"\n      },\n      {\n         \"_id\": \"129454141\",\n         \"bio\": null,\n         \"created_at\": \"2016-07-13T14:40:42.398257Z\",\n         \"display_name\": \"dallasnchains\",\n         \"logo\": null,\n         \"name\": \"dallasnchains\",\n         \"type\": \"user\",\n         \"updated_at\": \"2017-02-04T14:32:38.626459Z\"\n      }\n   ]\n}\n
\n\n

Root URL

\n\n

The root for all API resources is https://api.twitch.tv/kraken.

\n\n

If you submit a request to the root URL and you are authenticated, the response includes the status of your token. For example, this request:

\n\n
curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Authorization: OAuth cfabdegwdoklmawdzdo98xt2fo512y' \\\n-X GET https://api.twitch.tv/kraken\n
\n\n

Gets this response:

\n\n
{\n   \"token\": {\n      \"authorization\": {\n         \"created_at\": \"2016-12-14T15:51:16Z\",\n         \"scopes\": [\n            \"user_read\"\n         ],\n         \"updated_at\": \"2016-12-14T15:51:16Z\"\n      },\n      \"client_id\": \"uo6dggojyb8d6soh92zknwmi5ej1q2\",\n      \"user_id\": \"44322889\",\n      \"user_name\": \"dallas\",\n      \"valid\": true\n   }\n}\n
\n\n

Blank fields

\n\n

Blank fields are included as null.

\n\n

JSON and JSONP

\n\n

All data is sent and received as JSON.

\n\n

All API endpoints support JSONP by providing a callback parameter with the request:

\n\n

curl -i https://api.twitch.tv/kraken?callback=foo

\n\n

The returned MIME type for JSONP requests is:

\n\n

application/javascript

\n\n

Query Parameters

\n\n

In the reference documentation for endpoints, query string parameters are listed where they apply to an endpoint. The syntax for using query string parameters is as follows:

\n\n
<URL for the endpoint, with required params>?<query param 1>=<value 1>&<query param 2>=<value 2>...\n
\n\n

For example, the Get Feed Posts endpoint has three optional query string parameters, limit, cursor, and comments. If all three query string parameters are used, the URL is:

\n\n
https://api.twitch.tv/kraken/feed/<feed user ID>/posts?limit=<limit value>&cursor=<cursor value>\n&comments=<comments value>\n
\n\n

Responses

\n\n

All responses are JSON objects.

\n\n

Paging through results: cursor v. offset

\n\n

When fetching multiple items, there are two different mechanisms to page through results, offset and cursor.

\n\n

For some endpoints, you set a limit, set offset to 0, and add the limit value to the offset value each time you want to see the next page.

\n\n

For other endpoints, offset is deprecated; instead, a cursor is returned. This is used to tell the server where to start fetching the next set of results. For example:

\n\n
curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X GET https://api.twitch.tv/kraken/channels/44322889/follows\n
\n\n

might return something like this:

\n\n
{\n   \"_cursor\": \"1481675542963907000\",\n   \"_total\": 41,\n   \"follows\": [{\n      \"created_at\": \"2016-12-14T00:32:22.963907Z\",\n      \"notifications\": false,\n      \"user\": {\n            \"_id\": \"129454141\",\n            \"bio\": null,\n            \"created_at\": \"2016-07-13T14:40:42.398257Z\",\n            \"display_name\": \"dallasnchains\",\n            \"logo\": null,\n            \"name\": \"dallasnchains\",\n            \"type\": \"user\",\n            \"updated_at\": \"2016-12-14T00:32:16.263122Z\"\n      }\n   },\n   ...\n   ]\n}\n
\n\n

For the next page of results, construct your query as follows:

\n\n
curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X GET https://api.twitch.tv/kraken/channels/44322889/follows?cursor=1481675542963907000\n
\n\n

You would get the next set of results, as well as the next cursor.

\n\n

When there are no more items to be returned, the cursor in the response is blank.

\n\n

The correct parameter to use (offset or cursor) is noted in the reference documentation for each endpoint.

\n\n

Errors

\n\n

All error responses have the following format, delivered with a standard HTTP status code. The error message varies depending on the endpoint.

\n\n
{\n  \"message\":\"Invalid Token\",\n  \"status\":401,\n  \"error\":\"Unauthorized\"\n}\n
\n\n

Common response codes are:

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
HTTP Status CodeExplanation
400Request Not Valid. Something is wrong with the request.
401Unauthorized. The OAuth token does not have the correct scope or does not have the required permission on behalf of the specified user.
403Forbidden. This usually indicates that authentication was provided, but the authenticated user is not permitted to perform the requested operation. For example, a user who is not a partner might have tried to start a commercial.
404Not Found. For example, the channel, user, or relationship could not be found.
422Unprocessable Entity. For example, for a user subscription endpoint, the specified channel does not have a subscription program.
429Too Many Requests
500Internal Server Error
503Service Unavailable. For example, the status of a game or ingest server cannot be retrieved.
\n\n

When using JSONP, the status code is always 200, to allow browsers to parse it. Check the body of the response for the error data.

\n","url":"/docs/v5/","relative_path":"_docs/v5.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Clips Discovery Guide","parent_doc":"v5","order_number":2,"sub_menu_name":null,"slug":"clips-discovery","ext":".md","tags":[],"excerpt":"

Clips Discovery Guide

\n","nav_count":0,"article_key":"clips-discovery","date":"2021-10-12 22:12:21 +0000","content":"

Clips Discovery Guide

\n\n

Introduction

\n\n

Clips discovery endpoints enable you to discover user-generated, short-form video content about a game or channel or from a user’s followed games. You can retrieve clips in multiple ways, such as for a specified time period or based on viewcount or trending popularity.

\n\n

You can use clips discovery in conjunction with video embedding to showcase the top content about your game or channel directly on your own Web site. (See the Embedding Video & Clips guide.)

\n\n

This guide cover two clips discovery use cases:

\n\n\n\n

Both scenarios take advantage of video embedding, to show a complete, end-to-end experience.

\n\n

Also see the Clips Reference.

\n\n\n\n

In this example, we use a simple HTML page that requests clips for a specified game and embeds clips for the top 10 trending clips.

\n\n

First, we create a simple HTML page with a div id that we will use later to display the embedded clips:

\n\n
<html>\n<head>\n   <title>Clips Carousel</title>\n</head>\n<body>\n   <div id=\"clips-display\"></div>\n</body>\n</html>\n
\n\n

Second, we add JavaScript to the page, to request the clips and handle the event when data has loaded:

\n\n
var httpRequest = new XMLHttpRequest();\n\nhttpRequest.addEventListener('load', clipsLoaded);\nhttpRequest.open('GET', 'https://api.twitch.tv/kraken/clips/top?limit=10&game=Overwatch&trending=true');\nhttpRequest.setRequestHeader('Client-ID', 'uo6dggojyb8d6soh92zknwmi5ej1q2');\nhttpRequest.setRequestHeader('Accept', 'application/vnd.twitchtv.v5+json');\nhttpRequest.send();\n
\n\n

Finally, we add JavaScript to display the clips embeds on the page:

\n\n
function clipsLoaded() {\n    var clipsDisplay = document.getElementById('clips-display'),\n        clipList = JSON.parse(httpRequest.responseText);\n\n    clipList.clips.forEach(function(clip, index, array) {\n        clipItem = document.createElement('div');\n        clipItem.innerHTML = clip.embed_html;\n        clipsDisplay.appendChild(clipItem);\n    });\n}\n
\n\n

Example: Retrieving Most Viewed Clips for a Channel

\n\n

For this example, we re-use the HTML and rendering above and simply change the JavaScript call in the second part, to get the most-viewed clips:

\n\n
var httpRequest = new XMLHttpRequest();\n\nhttpRequest.addEventListener('load', clipsLoaded);\nhttpRequest.open('GET', 'https://api.twitch.tv/kraken/clips/top?limit=10&channel=moonmoon_ow');\nhttpRequest.setRequestHeader('Client-ID', 'uo6dggojyb8d6soh92zknwmi5ej1q2');\nhttpRequest.setRequestHeader('Accept', 'application/vnd.twitchtv.v5+json');\nhttpRequest.send();\n
\n","url":"/docs/v5/guides/clips-discovery/","relative_path":"_docs/v5/guides/clips-discovery.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Video Upload Guide","parent_doc":"v5","order_number":3,"sub_menu_name":null,"slug":"video-upload","ext":".md","tags":[],"excerpt":"

Video Upload Guide

\n","nav_count":0,"article_key":"video-upload","date":"2021-10-12 22:12:21 +0000","content":"

Video Upload Guide

\n\n

Introduction

\n\n

With video upload endpoints, you can upload videos directly to Twitch. These video endpoints enable you to create tools for creating and managing videos on Twitch.

\n\n

Broadcasters often like to add personal branding (for intros and outros) and create compilation videos from their streams. With the video endpoints, you can enable those experiences and upload the end result directly to Twitch.

\n\n

Note: You must be a partner or affiliate to upload VODs.

\n\n

Video Formats

\n\n

When uploading a video, the API accepts the following formats:

\n\n\n\n

Rate Limits

\n\n

There is a rate limit of 5 simultaneous uploads per user, with a maximum of 100 uploads in 24 hours.

\n\n

How to Upload a Video

\n\n

1. Get an Authentication Token

\n\n

You need an OAuth token with the channel_editor scope for the channel where the video will live. Once you have the token, you add it to the Authorization header when you create the video.

\n\n

For information about getting OAuth access tokens, see the Apps & Authentication Guide.

\n\n

2. Create a Video

\n\n

See the Create Video endpoint.

\n\n

This example creates a video entitled “Test video” in the 44322889 channel.

\n\n
curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Authorization: OAuth cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X POST 'https://api.twitch.tv/kraken/videos?channel_id=44322889&title=Test video'\n
\n\n

The response will include the following information, which is used in subsequent steps:

\n\n\n\n

3. Upload Video Parts

\n\n

See the Upload Video Part endpoint.

\n\n

This uploads the first part of video 106400740, created in the prior step.

\n\n
curl -H 'Content-Length: 8896493' \\\n--data-binary \"@test.mp4\" \\\n-X PUT 'https://uploads.twitch.tv/upload/106400740?part=1&upload_token=7_STl2gsKwDy1mHj2k95ld3aodDl3E_NzzQdSlN9ll0p6Ct0xFhvrO5bWu7tGUKEH5jtD_hjB9q3X4vTOQ000B1UcmMxduT30FuHhAmFYgYf7DoJE9PVvGRZqk9WQAR2ZGphUpj_237smnjE2gMoaQ--'\n
\n\n

4. Complete the Video Upload

\n\n

See the Complete Video Upload endpoint.

\n\n

This example completes the upload of video 106400740.

\n\n
curl -X POST 'https://uploads.twitch.tv/upload/106400740/complete?upload_token=7_STl2gsKwDy1mHj2k95ld3aodDl3E_NzzQdSlN9ll0p6Ct0xFhvrO5bWu7tGUKEH5jtD_hjB9q3X4vTOQ000B1UcmMxduT30FuHhAmFYgYf7DoJE9PVvGRZqk9WQAR2ZGphUpj_237smnjE2gMoaQ--'\n
\n","url":"/docs/v5/guides/video-upload/","relative_path":"_docs/v5/guides/video-upload.md","permalink":null},{"draft":false,"categories":[],"layout":"docs","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Video Broadcast","sub_menu_name":null,"parent_doc":null,"order_number":1,"slug":"video-broadcast","ext":".md","tags":[],"excerpt":"

Video Broadcasting Overview

\n","nav_count":0,"article_key":"video-broadcast","date":"2021-10-12 22:12:21 +0000","content":"

Video Broadcasting Overview

\n\n

There are thousands of Twitch broadcasters. A broadcaster sends a video stream to Twitch using any of several tools:

\n\n\n\n

The tool sends a video signal captured from the broadcaster’s game and cameras, through the open Internet, into Twitch using Real-Time Messaging Protocol (RTMP).

\n\n

The first stop for a broadcast stream is the Twitch ingesting subsystem, where streams enter Twitch and are authorized and registered, then prepared for viewers. You select an ingest server to receive your stream. There are many ingest servers, each living in a PoP (Point of Presence, a small-to-medium deployment of servers in a co-location facility, normally at a major internet exchange point).

\n\n

Broadcast URLs and Stream Keys

\n\n

Each broadcast uses an RTMP URL with this format:

\n\n

rtmp://<ingest-server>/app/<stream-key>[?bandwidth_test=true]

\n\n

Where:

\n\n\n\n

Example: rtmp://sfo.contribute.live-video.net/app/live_user_123456789?bandwidth_test=true

\n\n

For more detailed recommendations on broadcasting guidelines and codecs, please consult https://stream.twitch.tv.

\n","url":"/docs/video-broadcast/","relative_path":"_docs/video-broadcast.md","permalink":null}],"tutorials":[{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Build Your Backend","sub_menu_name":null,"order_number":6,"slug":"build-backend","ext":".md","tags":[],"excerpt":"

Build Your Backend

\n","date":"2021-10-12 22:12:21 +0000","content":"

Build Your Backend

\n\n

We will now move on to integrating a backend for your Extension. Having a backend is important if you want to a) process business logic that shouldn’t be exposed to the front end or b) establish connections and integrations into other services such as a database. Extension backends can be in any language, use any hosting, and utilize any database.

\n\n

In this tutorial, we will be building a backend to save the questions the viewers submitted and display them to the broadcaster via the live configuration page on the dashboard.

\n\n

Software used in this tutorial includes:

\n\n\n\n

Note: You can use any database service that you are familiar with.

\n\n

Step 1: Set up Your System

\n\n
    \n
  1. Install Node.js. Please refer to tutorial 4 for directions on how to install it.
  2. \n
  3. Install MongoDB locally. A quick way to install MongoDB is to use homebrew.
  4. \n
  5. \n

    We also need to install libraries we will need (Express, Mongoose, Body-Parser, and JSONWebToken) via the Node Package Manager (NPM). Open your terminal and navigate to the local project directory.
    Enter the following commands:

    \n\n
    npm init -yes\nnpm install express mongoose body-parser jsonwebtoken --save\n
    \n
  6. \n
\n\n

Note: Even though we are installing the jsonwebtoken library here, we won’t be using it until the next section.

\n\n

Step 2: Understanding the Backend.js starter code

\n\n

We provided some of the basic code needed to set up Express and Mongoose in backend.js. Let’s take a second to understand what we are doing in this provided starter code.

\n\n

Importing Libraries

\n\n

On lines 2-4, we have imported the necessary libraries that we will use: express, Mongoose, body-parser, and jsonwebtoken.

\n\n

Express

\n\n\n\n

Mongoose

\n\n\n\n

Note: We recommend looking at additional resources such as the Mongoose and Express Getting Started tutorials for a deeper understanding of how we are building this backend.

\n\n

Step 3: Submitting questions to the database

\n\n

Now that we’ve set up our basic Mongoose and Express backend, we will use this framework to save the questions the users submit.

\n\n

When a user clicks the submit button in the panel view, we need to send an AJAX request to the backend. Add the following function to viewer.js:

\n\n\n\n

Through this function, a POST request is sent to the given URL with the specified data. Going back to the Mongoose vocabulary we defined earlier: whenever a user submits a question, we want to enter a document into the defined Question collection. Let’s see how the backend takes care of this.

\n\n

The AJAX request is sent to the provided URL which points to the Express app.post() routing method. In this routing method, we have handler function /question that is called when the POST request is received. Add this method to the backend.js file.

\n\n\n\n

In this method, we use the body of the request, which contains the user’s options to create the myData document, an instance of the Question model. We can easily view and parse the user’s options from the body of the request because of the body-parser package we imported. We then use the save function to save the newly created document to the database as a JSON object.

\n\n

Step 4: Displaying submitted questions on Live Config Page

\n\n

Now that we’ve saved the user’s submitted questions, we want the broadcaster to be able to view these questions in the live configuration page. Right now, the live config page displays a button. Once the broadcaster clicks this button, they should be able to see all the submitted questions from different viewers. Add the following function to live_config.js.

\n\n\n\n

Through this function, a GET request is sent to the given URL. We want to retrieve all the documents in the defined Question collection. Once this request is handled successfully, we want to change the UI from displaying a button to displaying the submitted questions. Lines 7-13 handle this.

\n\n

The AJAX request is sent to the provided URL which points to the Express app.get() routing method. In this routing method, we have handler function /questions that is called when the GET request is received. Add this method to the backend.js file.

\n\n\n\n

In this method, we use the find function to find all documents in the collection, and send them back in the response.

\n\n

Check: Code until this point is available on Step 2 Branch.

\n\n

Before we test it, we have to explore a very important topic of how we can keep this communication between the frontend and the backend secure!

\n","url":"/tutorials/extension-101-tutorial-series/build-backend/","relative_path":"_tutorials/extension-101-tutorial-series/build-backend.md","permalink":null},{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Configuration Service","sub_menu_name":"Configuration Service","order_number":4,"slug":"config-service","ext":".md","tags":[],"excerpt":"

Configuration Service

\n","date":"2021-10-12 22:12:21 +0000","content":"

Configuration Service

\n\n

Now that we’ve set up the basic architecture of an Extension, let’s explore how different pages interact with each other. The first interaction we are going to look at is between the broadcaster’s configuration page and the viewer’s page. Specifically, we want to be able to save the broadcaster’s preferences for what WYR options should be shown to the viewers, and present those selected options to the viewer in the panel view. We can use the Twitch-provided Configuration Service to allow the broadcaster to customize the Extension.

\n\n

Key Concept: We can think of the Configuration Service as a key-value pair service for basic data stores. By allowing the developer to easily read and write to a store, the Configuration Service helps developers because it:

\n\n\n\n

Step 1: Config View Logic

\n\n

In the broadcaster’s configuration page, we can use jQuery to write a function that will retrieve all the selected options in the fieldset form we say in previous tutorial and then save them as an array. We need to add the following function to config.js:

\n\n\n\n

Step 2: Set Configuration

\n\n

We now need to write the saved broadcaster’s options that we saved as an array to the configuration service. To do this, we are going to use the twitch.configuration.set function from the Extensions Helper Library to essentially set the Extension Configuration.

\n\n

Key Concept: An Extension configuration is made up of segments that consist of three values: type, Extension version, and configuration value. Segment types refer to who can read and write the configurations, and thus can be set to the broadcaster, developer, or global. More information on these types can be found in the documentation for the configuration service.

\n\n

For this Extension, the broadcaster is setting the configuration, for version one, and saving a value of options (needs to be saved as a string). Thus, we need to add the following function to the config.js.

\n\n\n\n

For more information on the set function, check out the Extension Helper Library.

\n\n

Step 3: onChanged Configuration

\n\n

The next thing is to render the broadcaster’s options in the viewer’s panel. We can access the configuration information that was set in the previous step through twitch.configuration.broadcaster.content. However, we should only access this information inside the twitch.configuration.onChanged function when the contents of the broadcaster variable have completely loaded. This onChanged function essentially is called when an Extension configuration is received, which happens only once, on extension load!

\n\n

Once you have the contents of your configuration, you can parse the values and update the panel view. To do this, add the following function to config.js and viewer.js.

\n\n\n\n

On line 11, you can see that we are calling a function called updateOptions(). This function is going to update the options on the viewer side. Let’s add this next!

\n\n

Step 4: PanelView Logic

\n\n

We want the Extension to be able to save the WYR options that the broadcaster selected in config.html and provide them to the viewer’s interface, panel.html, as selectable options in the drop down menus. To do this, we need some basic javascript logic that will be able to take an array and present each item of the array as an option in the drop down menu. Add the following function to common.js.

\n\n\n\n

Now that we’ve set up the Configuration Service, it’s time to test it.

\n\n

Check: If you want to see the completed code at this stage, its available on the Step 1 branch.

\n","url":"/tutorials/extension-101-tutorial-series/config-service/","relative_path":"_tutorials/extension-101-tutorial-series/config-service.md","permalink":null},{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Create an Extension","sub_menu_name":"Create an Extension","order_number":2,"slug":"create-extension","ext":".md","tags":[],"excerpt":"

Create an Extension

\n","date":"2021-10-12 22:12:21 +0000","content":"

Create an Extension

\n\n

Let’s get started by setting up the Extension up via the Extensions Console.

\n\n

Two-factor Authentication

\n\n
    \n
  1. \n

    If you do not already have a Twitch account, go to twitch.tv in a browser and create an account using the Sign Up button in the top right of the page.

    \n
  2. \n
  3. \n

    You will need to enable two-factor authentication on your account to build Extensions, so please visit your Security and Privacy settings to confirm it is enabled or activate it.

    \n
  4. \n
\n\n

Creating the Extension in the Console

\n\n
    \n
  1. \n

    Go to the Extensions Developer Console. From this console, you can start the process of creating a new Extension, view and clone your Extensions, and manage specific versions of your Extension(s). Login with your Twitch ID. You should see a page like this:
    \"Extensions

    \n
  2. \n
  3. Click the Create an Extension button on the right side of the page.
  4. \n
  5. \n

    Fill in the Name Your Extension section with any name you want, and then click Continue.
    \"Start

    \n
  6. \n
  7. On this versions page, be sure to fill out respective fields\n \n
  8. \n
  9. Click Create Extension Version. You will then see the Status page of the Extension Manager. This page essentially shows the current status (Local Test) of the Extension in the Extension Life Cycle, and also provides you with next steps to move the Extension through the life cycle. You should see the following page:
    \"Create
  10. \n
\n\n

Concept: Extension Life Cycle

\n\n

The Extension Life Cycle details the various development stages of an Extension. You can find more information about each of these stages in our documentation.
\"\"\"Extension

\n","url":"/tutorials/extension-101-tutorial-series/create-extension/","relative_path":"_tutorials/extension-101-tutorial-series/create-extension.md","permalink":null},{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Extension File Structure and HTML Views","sub_menu_name":"File Structure","order_number":3,"slug":"file-structure","ext":".md","tags":[],"excerpt":"

Extension File Structure and HTML Views

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extension File Structure and HTML Views

\n\n

Environment Set-Up

\n\n

In this section, we are going to start building the Extension. But before that, you need to download the starter code from the following Github repository using the green Clone or Download button here: https://github.com/sonia145/Extensions-101.

\n\n

Your Extension’s directory should look something like this:

\n\n
Would You Rather\n  - config.html\n  - panel.html\n  - live_config.html\n  - config.js\n  - viewer.js\n  - live_config.js\n  - common.js\n  - backend.js\n
\n\n

Save these files in a local directory. Feel free to open these files up in a text editor and follow along as we walk through the basic front-end architecture of the Extension.

\n\n

Important! This code is intentionally incomplete and there are active development steps, but if you get stuck, frustrated, bored, or are running low on time, you can instantly warp to the next step by switching branches. For example, to complete step two and skip to step three, either:

\n\n\n\n

Step 1: Basic Front-end Architecture

\n\n

The front end is composed of HTML, JS, and CSS files. Every Extension needs to be comprised of at least two front-end pages: the viewer and configuration page. The viewer page is what the viewers will see and interact with on the broadcaster’s channel, and the configuration page is what the broadcaster sees when they are going through the Extension configuration process, which is a one-time setup when installing the Extension on their channel for the first time.

\n\n

There is an additional front end for the broadcaster’s live experience. In our WYR Extension, we are going to start with these three front-ends:

\n\n\n\n

Important: Each page must load the Extension Helper Library, which is created and hosted by Twitch. This library provides methods for dealing with various critical services like authorization. You can see how this library is embedded in Line 10 of the config.html file.

\n\n

Further Consideration

\n\n

If you look in the file directory, you see that we call the viewer page, panel.html. We do this to clarify that this is specifically for the panel version of the Extension. We could also have another viewer page that supports another Extension type, such as an overlay. This allows developers to build out the same Extension in various different formats without needing to create a new Extension.On the broadcaster side, they can choose what type of extension format they want to activate on their channel. This information is sent as a query parameter to the Extension window. This concept is called Dynamic Anchors.

\n\n

Step 2: Viewer Page

\n\n

The purpose of the viewer page is for the viewers to be able to engage in a creative process of building a WYR dilemma, and then submit their question to the broadcaster. From a viewer’s perspective, they will see the following page:
\"Viewer

\n\n

In panel.html, we have created a form with select tags to provide two drop down lists. Through this user interface, the viewer can create their own WYR dilemma from options provided in drop down menus. Upon clicking submit, the viewer’s question will be saved.

\n\n

Step 3: Live Configuration Page

\n\n

Through the live configuration page, broadcasters will be able to see the WYR questions coming in live from viewers.
\"Live

\n\n

In live_config.html, we have a button that the broadcaster clicks on to to view the submitted questions. Once selected, a vertical table of questions will be shown to the viewer.

\n\n

Step 4: Configuration Page

\n\n

Through the broadcaster’s configuration page, they will be able to select options they would like viewers to be able to choose from.
\"Configuration

\n\n

In config.html, you will see that a basic fieldset form is already created that allows the broadcaster to select what WYR options viewers will be able to select from. All options are defaulted to checked so that it’s easier for the broadcaster to simply opt out of a certain option.

\n\n

Further Consideration

\n\n

As you can see from the HTML file, we are manually writing these options in as individual checkboxes. However, if we wanted to include more options without manually writing them in, we could use a backend service to save the options and just request for them to be shown on page load.

\n","url":"/tutorials/extension-101-tutorial-series/file-structure/","relative_path":"_tutorials/extension-101-tutorial-series/file-structure.md","permalink":null},{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Twitch Extensions Tutorials","external_image":"/assets/images/placeholder.jpeg","external_description":"Step by step tutorials for how to build a Twitch Extension from start to finish","sub_menu_name":"Tutorials","parent_doc":"extensions","order_number":1,"slug":"introduction","ext":".md","tags":[],"excerpt":"

Twitch Extensions Tutorials: Introduction

\n","date":"2021-10-12 22:12:21 +0000","content":"

Twitch Extensions Tutorials: Introduction

\n\n

Prerequisites

\n\n

Requires knowledge of:

\n\n\n\n

Objectives

\n\n\n\n

What are Extensions?

\n\n

Extensions are web apps that are embedded as HTML iframes into a broadcaster’s channel. Extensions live in the broadcaster’s creator dashboard and provide more engaging, interactive experiences for both the broadcaster and the viewers. In this tutorial series, we will build a panel Extension. You can find more information about each type of Extension here.

\n\n

What are we going to build?

\n\n

Through these tutorials, we will be building an Extension that implements the “Would You Rather..?” conversation game. For those of you unfamiliar with that game, essentially the idea is that viewers will have the ability to ask questions that begin with “Would you rather…?” and select two scenarios for the broadcaster to choose from. The more similar the two choices are, the harder the dilemma. On stream, the broadcaster must choose one of the scenarios they would rather do. This Extension thus helps create a more engaging experience specifically for chat-oriented streams.

\n\n

While this is the basic idea of the Extension we are going to build, we will also be adding other features to emphasize how Extensions can provide a better, more engaging experience for both the broadcaster and the viewers. Awesome! Now that we know what we are going to accomplish in this tutorial, let’s start building.

\n","url":"/tutorials/extension-101-tutorial-series/introduction/","relative_path":"_tutorials/extension-101-tutorial-series/introduction.md","permalink":null},{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"JSON Web Tokens (JWT)","sub_menu_name":"Tutorial: JSON Web Tokens","order_number":7,"slug":"jwt","ext":".md","tags":[],"excerpt":"

JSON Web Tokens (JWT)

\n","date":"2021-10-12 22:12:21 +0000","content":"

JSON Web Tokens (JWT)

\n\n

We need to explore how to keep communications secure through JSON Web Tokens (JWTs). For more information about JWTs, look here.

\n\n

Concept: A JSON Web Token (JWT) is a JSON object that is signed by Twitch, using a secret shared between Twitch and the Extension developer. The JWT contains properties such as channelID or expiration_date. To see other properties, consult the JWT Schema.

\n\n

Twitch Extensions specifically use two roles of JWTs: broadcaster and external.

\n\n

Role 1: Broadcaster

\n\n\n\n

Role 2: External

\n\n\n\n

In this section, we will be demonstrating how to use a JWT to authorize the communication between the users and the Extension’s backend.

\n\n

Step 1: Adding Authorization Header to AJAX call

\n\n

When viewers submit a WYR question from the panel view, the JWT that was provided via onAuthorized needs to be sent in an HTTP header to the backend. Let’s go back to our AJAX POST call in viewer.js and pass in the JWT through the headers parameter by adding. Thus, our new AJAX call should look like this:

\n\n\n\n

Step 2: JWT Secret

\n\n

Once the JWT is sent to the backend, the next step is verifying the authenticity of this token. We do this by using a Shared Secret.

\n\n

Concept: Each Extension maintains a shared secret that is used to sign tokens that validate the identity of users. Extension Secret is base64 encoded and is provided to you by the Extension Manager.

\n\n

To retrieve the secret, lets go to the Extension Manager. To get to the Manager, go to the console, select a version of the Extension and click Manage. Once on this page, you will see the default status page. On the top right of the manager, click the Extension Settings button. You will see the following page:
\"Extension

\n\n

Under the Extension Client Configuration section, copy the key provided. We need to use this key to verify that the token provided is signed with the same secret. To use the key, we first need to save it and decode it from its base64 encoding. Add the following lines to do this in backend.js:

\n\n
  const key =\"INSERT_YOUR_EXTENSION_SECRET_HERE\";\n  const secret = Buffer.from(key, 'base64');\n
\n\n

Step 3: Verify the JWT

\n\n

In the backend, we need to verify the JWT and save the JWT’s decoded content. We are going to create a function called verifyAndDecode in backend.js to carry out this logic:

\n\n\n\n

The parameter passed into this function is the header from the AJAX call that contains the token. Using this header, we extract out the token, and use the verify method from the jsonwebtoken library, which is just a simple Node.js Library for verifying and signing JSON Web Tokens. This method returns decoded information that the JWT contained. Now that we have created this function, let’s use it!

\n\n

We want to be able to call this verifyAndDecode method in the app.post() method. Remember, this method handles the response to the POST request. To do this, add the following line to the method:

\n\n
const payload = verifyAndDecode(req.headers.authorization);\n
\n\n

Thus, our routing method should now look like the following:

\n\n\n\n

Step 4: Testing

\n\n

Let’s test the extension! Since our extension is still in local testing, we can test the extension just like we did in Tutorial 4. Feel free to jump back to that section if you need to review how to test extensions in the console.

\n\n

With these new additions we’ve added, be sure to save your files. Navigate to your channel, and scroll down to the Panel Section to see the extension view that viewers will see if this was live:
\"Panel

\n\n

Submit a question and you should see a “Your Question has been submitted!” response.

\n\n

Now let’s confirm that the streamer can view the question (and other viewer’s questions). To do this, you need to navigate to your creator dashboard and go to the Extensions panel. In the dropdown menu, you will see all the extensions you installed. Click Would You Rather?. You should then see the following screen:
\"Extension

\n\n

Clicking on the button should display the option you selected. Feel free to select more options and see how they will also be displayed.

\n","url":"/tutorials/extension-101-tutorial-series/jwt/","relative_path":"_tutorials/extension-101-tutorial-series/jwt.md","permalink":null},{"draft":false,"categories":[],"layout":"tutorials","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"navigation_theme":"Purple","footer_theme":"Dark","title":"Locally Test Your Extension","sub_menu_name":"Tutorial: Test Your Extension","order_number":4,"slug":"local-test","ext":".md","tags":[],"excerpt":"

Locally Test Your Extension

\n","date":"2021-10-12 22:12:21 +0000","content":"

Locally Test Your Extension

\n\n

To test the Extension, go to the Extensions Developer Console.​ From there, click Manage next to the Extension name, and you’ll be redirected to the same status page we saw in Tutorial #1.

\n\n

Step 1: Base URL

\n\n

In Local Test, all Extension assets (files) are served from a defined testing base URI, so we need to use a local web server to host the files we’ve been working on in our local directory. Feel free to set up the local server in any way you want, and use any service.

\n\n

Local Server Setup

\n\n

One possible way to set up a local server is through Node.js.

\n\n
    \n
  1. Install N​ode.js
  2. \n
  3. Run n​pm install -g http-server
  4. \n
  5. Go into file directory and then run​ http-server. ​You will see something like this:
    \"http-server
  6. \n
\n\n

Once you have a server setup, click on the Asset Hosting Tab and edit the Testing Base URL to match URL from server set-up.
\"Asset

\n\n

Check:​ ​Make sure when adding the URL of your local server into the section, that the URL ends with a forward slash (/).

\n\n

Further Consideration:​ During Local Test, the assets are served directly from this URI, so you can update your code without re-submitting the Extension version. In Hosted Test, you can just directly upload your files and test your Extension without a local server; however, if you want to change any of your Extension version details (e.g., name, description, images, etc), you must move back to Local Test. In Hosted Test, assets are hosted by Twitch are copied to the Twitch CDN (Content Delivery Network) and served from there.

\n\n

Step 2: Enabling the Configuration Service

\n\n

Before testing the Extension, go to the Console Manager and enable the Configuration Service. Go to the Capabilities tab of the Extension Manager, and scroll down to the second frame, where you should see a section titled “Select how you will configure your Extension.” Select Extension Configuration Service​, and then save the changes.
\"Enable

\n\n

Step 3: Install, Configure, and Activate Your Extension

\n\n

We are ready to see the Extension live on Twitch! To do so, go to the Status page of the Extension Manager, and scroll down to the section titled “Next Steps.” Click the ​View on Twitch and Install​ button.
\"View

\n\n

Clicking this button will open a new tab with the Extension Details page.
\"Extension

\n\n

Installation:​ Next, click the purple I​nstall ​button. When the Extension is installed, you will see a confirmation pop-up informing you that Extension installation is complete, and that if you want to activate the Extension right now, you need to configure it.
\""Extension

\n\n

Configuration:​ Click ​Configure​. Upon doing so, you will be directed to the Broadcaster Configuration Page. Here we see the page we created where the Broadcaster can select the options they want viewers to be able to choose from. Feel free to select a couple of these options and then click ​Submit​. After doing so, close out of this page.
\"Broadcaster

\n\n

Upon closing this window, we land upon the Extensions page in the Broadcaster’s Dashboard.
\"Extensions

\n\n

Activation:​ From this dashboard, select the W​ould You Rather…? Extension then click the Activate​ button. Upon doing so, you’ll see a couple of options. Select S​et as Panel 1​. If the activation is successful, you will see the following confirmation:
\"Activation

\n\n

Step 4: Testing the Extension on Your Channel

\n\n

Now it’s time to see how the Extension acts on the viewer side as a Panel. Navigate to your channel, and scroll down to the Panel Section (below the video player). You should see the following panel:
\"Extension

\n\n

Clicking A​ccept​ will bring you to the Panel that viewers will see if this extension were live.
\"Extension

\n\n

Check:​ At this point, we have built a functioning Extension that utilizes the Configuration Service, and covered various concepts such as dynamic anchors, life cycle management, and Extension configuration.

\n\n

As you can see, the Configuration Service removes the need for a backend enables developers to build simple front-end-only Extensions that provide unique experiences for their viewers. However, in this Extension, we are going to set up a backend service to save the submitted WYR questions from the viewers, and present them live to the broadcaster. Even for Extensions like this one that require a back-end, the Config Service supports scenarios that requires the ability to persist channel specific data. Next, we are going to demonstrate how to integrate a backend service, and show the questions the viewers submitted to the broadcaster live!

\n","url":"/tutorials/extension-101-tutorial-series/local-test/","relative_path":"_tutorials/extension-101-tutorial-series/local-test.md","permalink":null}],"changelog":[{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 03 29","slug":"2018-03-29","ext":".md","tags":[],"excerpt":"

Apps & Authentication Guide: See new wording in “Validating Requests.”

\n","date":"2021-10-12 22:12:21 +0000","content":"

Apps & Authentication Guide: See new wording in “Validating Requests.”

\n\n

Embedding Video and Clips: In “Interactive Frames for Live Streams and VODs” > “Events Emitted by and Defined by the Player,” a new PLAYING event was added and the definition of the PLAY event was changed.

\n\n

Extensions Guide: In “Appendix B: Guidelines and Practices,” the policy for audio was revised: “Extensions can include audio only if they include controls which allow viewers to adjust the volume, and by default, these controls are set to off/muted.” 5/2/18 update: Now that the Extensions Guide is split up, this information is in Extensions Guidelines & Policies.

\n\n

Extensions Reference: Changes related to the introduction of dynamic anchors. Search for “anchor” in the doc.

\n","url":"/changelog/2018-03-29.html","relative_path":"_changelog/2018-03-29.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 04 04","slug":"2018-04-04","ext":".md","tags":[],"excerpt":"

Embedding Video and Clips: In “Events Emitted by and Defined by the Player,” a new  Twitch.Player.PLAYBACK_BLOCKED event was added.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Embedding Video and Clips: In “Events Emitted by and Defined by the Player,” a new  Twitch.Player.PLAYBACK_BLOCKED event was added.

\n\n

New Twitch API Reference: A “Resource” column was added to the summary table of endpoints, then endpoints in the doc were re-ordered to match the table (so endpoints for the same resource are in the same part of the doc).

\n","url":"/changelog/2018-04-04.html","relative_path":"_changelog/2018-04-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 04 19","slug":"2018-04-19","ext":".md","tags":[],"excerpt":"

Embedding Video and Clips: In “Interactive Frames for Live Streams and VODs” > “Optional Parameter,” the default of the parameter playsinline parameter was changed to true.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Embedding Video and Clips: In “Interactive Frames for Live Streams and VODs” > “Optional Parameter,” the default of the parameter playsinline parameter was changed to true.

\n\n

Extensions Guide: Video-component extensions were added. Broadcasters can activate up to six extensions at a time: 3 panel, 1 video overlay (full screen), and 2 video component (smaller).

\n\n

Extensions Reference: Info was added about video-component extensions (new JS Helper function, onPositionChanged).

\n\n

New Twitch API Reference: In Get Clip, 4 query params were added (broadcaster_id, game_id, before, after).

\n","url":"/changelog/2018-04-19.html","relative_path":"_changelog/2018-04-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 04 29","slug":"2018-04-29","ext":".md","tags":[],"excerpt":"

Updated Organizations documentation. 

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Organizations documentation. 

\n","url":"/changelog/2018-04-29.html","relative_path":"_changelog/2018-04-29.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 05 02","slug":"2018-05-02","ext":".md","tags":[],"excerpt":"

Extensions: The Extensions Guide was split into several shorter docs. Look in the Extensions doc category.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions: The Extensions Guide was split into several shorter docs. Look in the Extensions doc category.

\n","url":"/changelog/2018-05-02.html","relative_path":"_changelog/2018-05-02.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 05 09","slug":"2018-05-09","ext":".md","tags":[],"excerpt":"

New Twitch API Reference:

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API Reference:

\n\n\n","url":"/changelog/2018-05-09.html","relative_path":"_changelog/2018-05-09.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 05 15","slug":"2018-05-15","ext":".md","tags":[],"excerpt":"

Getting Started with Extensions: In “Procedure for Non-Twitch Partners/Affiliates,” the last step of beginning the onboarding process was changed.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started with Extensions: In “Procedure for Non-Twitch Partners/Affiliates,” the last step of beginning the onboarding process was changed.

\n","url":"/changelog/2018-05-15.html","relative_path":"_changelog/2018-05-15.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 05 21","slug":"2018-05-21","ext":".md","tags":[],"excerpt":"

Embedding Twitch and Chatbots & IRC: These large documents were spit into several smaller docs, to make it easier to read and find information.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Embedding Twitch and Chatbots & IRC: These large documents were spit into several smaller docs, to make it easier to read and find information.

\n\n

Extensions Reference: The onVisibilityChanged JS helper function now works with component extensions.

\n","url":"/changelog/2018-05-21.html","relative_path":"_changelog/2018-05-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 05 31","slug":"2018-05-31","ext":".md","tags":[],"excerpt":"

Getting Started docs:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started docs:

\n\n\n\n

Extensions Reference: Changes to Send Extension PubSub Message (messages can be sent globally), listen and send JS Helper functions, and Example JWT Payload.

\n\n\n\n

New Twitch API: Webhooks Reference: Added two webhooks (User Changed, Game Analytics).

\n\n

Insights & Analytics: New doc, with information on both game developer analytics and extensions developer analytics. (Replaces the Game Developer Analytics doc.)

\n","url":"/changelog/2018-05-31.html","relative_path":"_changelog/2018-05-31.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 06 04","slug":"2018-06-04","ext":".md","tags":[],"excerpt":"

Having Extensions Reviewed: Before you submit an extension for review, you now select a category under which your extension will be shown in the Extension Manager and upload an image for “discovery” purposes. 3/7/19 update: This document was deleted; information is in Extensions Life Cycle Management.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Having Extensions Reviewed: Before you submit an extension for review, you now select a category under which your extension will be shown in the Extension Manager and upload an image for “discovery” purposes. 3/7/19 update: This document was deleted; information is in Extensions Life Cycle Management.

\n","url":"/changelog/2018-06-04.html","relative_path":"_changelog/2018-06-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 06 07","slug":"2018-06-07","ext":".md","tags":[],"excerpt":"

Embedding Video & Clips: In setVideo, added a new Timestamp parameter.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Embedding Video & Clips: In setVideo, added a new Timestamp parameter.

\n\n

Drops Guide: In “Next: Notify the Viewer about Drops,” added GUID to URLs.

\n","url":"/changelog/2018-06-07.html","relative_path":"_changelog/2018-06-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 06 19","slug":"2018-06-19","ext":".md","tags":[],"excerpt":"

Extensions Reference: Expanded the definition of onPositionChanged JS helper function.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Reference: Expanded the definition of onPositionChanged JS helper function.

\n\n

Building Extensions: In “Local Test,” added information about the new Invite Only tab, for seeing allowlisted extensions in the Extensions Manager.

\n\n

New Twitch API Reference: Added three endpoints: Get User Extensions, Get User Active Extensions, Update User Installed Extensions.

\n\n

Apps & Authentication: Added new scopes, for new endpoints.

\n\n

Embedding Twitch: Everything: For the layout parameter, changed the valid value from video-and-chat to video-with-chat.

\n\n

Twitch API v5: In “Which API Version Can You Use?” indicated that there is no scheduled deletion date for v5.

\n","url":"/changelog/2018-06-19.html","relative_path":"_changelog/2018-06-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 06 22","slug":"2018-06-22","ext":".md","tags":[],"excerpt":"

Insights & Analytics: Added V2 of game analytics.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Insights & Analytics: Added V2 of game analytics.

\n\n

New Twitch API Reference: Updated the Get Game Analytics endpoint, to enable selection of report version and date/time range.

\n\n

Chatbots & IRC Guide: Updated the information on “Connecting to Twitch IRC.”

\n","url":"/changelog/2018-06-22.html","relative_path":"_changelog/2018-06-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 07 06","slug":"2018-07-06","ext":".md","tags":[],"excerpt":"

Getting Started with Extensions, Building Extensions: Added information about the Twitch Developer Rig “local mode” (for local testing against mock, non-production endpoints).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started with Extensions, Building Extensions: Added information about the Twitch Developer Rig “local mode” (for local testing against mock, non-production endpoints).

\n\n

Extensions Guidelines & Policies: Added a note about which versions of Android and iOS must be supported by mobile extensions.

\n\n

Extensions Reference: Added two new fields to the onContext JS helper function (isMuted, volume).

\n\n

Apps & Authentication: Split this large document into several smaller docs, to make it easier to read and find information.

\n","url":"/changelog/2018-07-06.html","relative_path":"_changelog/2018-07-06.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 07 12","slug":"2018-07-12","ext":".md","tags":[],"excerpt":"

Twitch API v5 Channel Feed Reference: Changed (deprecated) most endpoint responses.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Twitch API v5 Channel Feed Reference: Changed (deprecated) most endpoint responses.

\n","url":"/changelog/2018-07-12.html","relative_path":"_changelog/2018-07-12.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 07 19","slug":"2018-07-19","ext":".md","tags":[],"excerpt":"

Bits in Extensions: New document.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Bits in Extensions: New document.

\n\n

Extensions Guidelines & Policies: Added Bits in Extensions requirements.

\n","url":"/changelog/2018-07-19.html","relative_path":"_changelog/2018-07-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 07 20","slug":"2018-07-20","ext":".md","tags":[],"excerpt":"

Apps & Authentication: GuideGetting Tokens: OAuth, & Getting Tokens: OIDC: Added token_type parameter (required value = bearer) in several places.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Apps & Authentication: GuideGetting Tokens: OAuth, & Getting Tokens: OIDC: Added token_type parameter (required value = bearer) in several places.

\n","url":"/changelog/2018-07-20.html","relative_path":"_changelog/2018-07-20.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 07 27","slug":"2018-07-27","ext":".md","tags":[],"excerpt":"

Designing Extensions: Added more guidance for all extensions and panel extensions.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Designing Extensions: Added more guidance for all extensions and panel extensions.

\n","url":"/changelog/2018-07-27.html","relative_path":"_changelog/2018-07-27.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 07 31","slug":"2018-07-31","ext":".md","tags":[],"excerpt":"

New Twitch API Reference: Added Get Webhook Subscriptions endpoint.

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API Reference: Added Get Webhook Subscriptions endpoint.

\n","url":"/changelog/2018-07-31.html","relative_path":"_changelog/2018-07-31.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 08 02","slug":"2018-08-02","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Tags: Marked some parameters as deprecated (subscriber, turbo, and user_type). Use the badges parameter instead.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Tags: Marked some parameters as deprecated (subscriber, turbo, and user_type). Use the badges parameter instead.

\n","url":"/changelog/2018-08-02.html","relative_path":"_changelog/2018-08-02.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 08 07","slug":"2018-08-07","ext":".md","tags":[],"excerpt":"

Insights & Analytics: Added V2 of extension analytics.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Insights & Analytics: Added V2 of extension analytics.

\n\n

New Twitch API Reference: Updated the Get Extension Analytics endpoint for V2.

\n\n

New Twitch API: Webhooks Reference: Added new webhook, Extension Analytics.

\n","url":"/changelog/2018-08-07.html","relative_path":"_changelog/2018-08-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 08 13","slug":"2018-08-13","ext":".md","tags":[],"excerpt":"

Building Extensions: Due to requirements recently communicated to us by Apple, Extensions support on iOS devices (including the ability to test on iOS) is now restricted to Apple Developer Program members. See “Mobile Support.”

\n","date":"2021-10-12 22:12:21 +0000","content":"

Building Extensions: Due to requirements recently communicated to us by Apple, Extensions support on iOS devices (including the ability to test on iOS) is now restricted to Apple Developer Program members. See “Mobile Support.”

\n\n\n\n

Extensions Reference: In Helper: Extensions, added new property (arePlayerControlsVisible) to the onContext JS helper function.

\n","url":"/changelog/2018-08-13.html","relative_path":"_changelog/2018-08-13.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 08 21","slug":"2018-08-21","ext":".md","tags":[],"excerpt":"

Insights & Analytics: Added Twitch Quarterly Insights (fact sheet for games).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Insights & Analytics: Added Twitch Quarterly Insights (fact sheet for games).

\n","url":"/changelog/2018-08-21.html","relative_path":"_changelog/2018-08-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 08 30","slug":"2018-08-30","ext":".md","tags":[],"excerpt":"

Extensions (several docs): Added pop-out Extensions. Start reading here in Required Technical Background (this links to relevant info elsewhere in the doc set).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions (several docs): Added pop-out Extensions. Start reading here in Required Technical Background (this links to relevant info elsewhere in the doc set).

\n\n

Extensions Reference: Added Send Extension Chat Message endpoint and Helper: Feature Flags (JS helper functions).

\n","url":"/changelog/2018-08-30.html","relative_path":"_changelog/2018-08-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 03","slug":"2018-09-03","ext":".md","tags":[],"excerpt":"

Getting Started with the New Twitch API: When registering your app, the app name must not include “Twitch” (as an exact or fuzzy match), or registration will fail.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started with the New Twitch API: When registering your app, the app name must not include “Twitch” (as an exact or fuzzy match), or registration will fail.

\n","url":"/changelog/2018-09-03.html","relative_path":"_changelog/2018-09-03.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 04","slug":"2018-09-04","ext":".md","tags":[],"excerpt":"

Insights & Analytics: Added three new clips fields to game-developer analytics.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Insights & Analytics: Added three new clips fields to game-developer analytics.

\n","url":"/changelog/2018-09-04.html","relative_path":"_changelog/2018-09-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 06","slug":"2018-09-06","ext":".md","tags":[],"excerpt":"

New Twitch API Reference: Added new endpoints, Create Stream Marker and Get Stream Markers.

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API Reference: Added new endpoints, Create Stream Marker and Get Stream Markers.

\n","url":"/changelog/2018-09-06.html","relative_path":"_changelog/2018-09-06.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 07","slug":"2018-09-07","ext":".md","tags":[],"excerpt":"

Extensions Reference: New JS helper function, minimize. See Helper: Actions

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Reference: New JS helper function, minimize. See Helper: Actions

\n","url":"/changelog/2018-09-07.html","relative_path":"_changelog/2018-09-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 11","slug":"2018-09-11","ext":".md","tags":[],"excerpt":"

New Twitch API Reference: New optional query string parameters (started_at and ended_at) for Get Clips.

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API Reference: New optional query string parameters (started_at and ended_at) for Get Clips.

\n","url":"/changelog/2018-09-11.html","relative_path":"_changelog/2018-09-11.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 14","slug":"2018-09-14","ext":".md","tags":[],"excerpt":"

New Twitch API: Webhooks Guide: There are changes to subscription limits. Each client ID can have at most 10,000 subscriptions. Also, you can subscribe to the same topic at most 3 times.

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API: Webhooks Guide: There are changes to subscription limits. Each client ID can have at most 10,000 subscriptions. Also, you can subscribe to the same topic at most 3 times.

\n","url":"/changelog/2018-09-14.html","relative_path":"_changelog/2018-09-14.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 09 28","slug":"2018-09-28","ext":".md","tags":[],"excerpt":"

Extensions Developer Rig: New document focusing on the rig. Also see changes to the Developer Rig section of Getting Started with Extensions.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Developer Rig: New document focusing on the rig. Also see changes to the Developer Rig section of Getting Started with Extensions.

\n\n

Extensions Reference: New hostingInfo property in the onContext JS helper function. New onHighlightChanged JS helper function.

\n\n

Apps & Authentication Guide: The chat_login scope is deprecated. See the section on new scopes for chat and PubSub.

\n\n

Chatbots & IRC Guide: New section on Scopes for IRC Commands.

\n\n

Mobile Deep Links: New section on launching the Twitch app with universal links (recommended).

\n","url":"/changelog/2018-09-28.html","relative_path":"_changelog/2018-09-28.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 01","slug":"2018-10-01","ext":".md","tags":[],"excerpt":"

Drops Guide: New functionality for creating and using items, with a new Item Manager page and new fields for items. See especially the section on using campaigns.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Drops Guide: New functionality for creating and using items, with a new Item Manager page and new fields for items. See especially the section on using campaigns.

\n","url":"/changelog/2018-10-01.html","relative_path":"_changelog/2018-10-01.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 02","slug":"2018-10-02","ext":".md","tags":[],"excerpt":"

Drops Guide: Added recommendations for campaigns.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Drops Guide: Added recommendations for campaigns.

\n\n

Webhooks Reference: Clarified the functionality of the Stream Changed webhook (formerly called Stream Up/Down).

\n","url":"/changelog/2018-10-02.html","relative_path":"_changelog/2018-10-02.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 09","slug":"2018-10-09","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Commands, Chatbots & IRC: Twitch Tags: Added CLEARMSG, single-message removal on a channel.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Commands, Chatbots & IRC: Twitch Tags: Added CLEARMSG, single-message removal on a channel.

\n","url":"/changelog/2018-10-09.html","relative_path":"_changelog/2018-10-09.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 10","slug":"2018-10-10","ext":".md","tags":[],"excerpt":"

Extensions: Added the new Configuration Service. See:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions: Added the new Configuration Service. See:

\n\n\n\n

Insights & Analytics: Added printing a poster view of Twitch Quarterly Insights.

\n","url":"/changelog/2018-10-10.html","relative_path":"_changelog/2018-10-10.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 16","slug":"2018-10-16","ext":".md","tags":[],"excerpt":"

Extensions: Onboarding is now required only for monetization (Bits).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions: Onboarding is now required only for monetization (Bits).

\n\n\n","url":"/changelog/2018-10-16.html","relative_path":"_changelog/2018-10-16.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 22","slug":"2018-10-22","ext":".md","tags":[],"excerpt":"

Apps & Authentication Guide: In “Types of Tokens,” added a clarification about bearer tokens.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Apps & Authentication Guide: In “Types of Tokens,” added a clarification about bearer tokens.

\n\n

New Twitch API Guide: New information in “Rate Limits.

\n\n

Getting Started with Extensions: Added the new Extensions Developer Sandbox.

\n","url":"/changelog/2018-10-22.html","relative_path":"_changelog/2018-10-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 23","slug":"2018-10-23","ext":".md","tags":[],"excerpt":"

New Twitch API Reference, New Twitch API: Webhooks Reference: Added a display-name response field to several endpoints and webhooks. Endpoints affected: Get Bits Leaderboard, Get Clips, Get Streams, Get Streams Metadata, Get Stream Markers, Get Users Follows, Get Videos. Webhooks affected: Stream Changed, User Follows.

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API Reference, New Twitch API: Webhooks Reference: Added a display-name response field to several endpoints and webhooks. Endpoints affected: Get Bits Leaderboard, Get Clips, Get Streams, Get Streams Metadata, Get Stream Markers, Get Users Follows, Get Videos. Webhooks affected: Stream Changed, User Follows.

\n\n

Building Extensions: Added information about pre-release disclosures. 3/7/19 update: Moved to Extensions Life Cycle Mangement.

\n","url":"/changelog/2018-10-23.html","relative_path":"_changelog/2018-10-23.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 10 24","slug":"2018-10-24","ext":".md","tags":[],"excerpt":"

Extensions Guidelines & Policies: New version of this document.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Guidelines & Policies: New version of this document.

\n","url":"/changelog/2018-10-24.html","relative_path":"_changelog/2018-10-24.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 11 02","slug":"2018-11-02","ext":".md","tags":[],"excerpt":"

Twitch IRC Capability: msd-ID Tags: This new document (under Chatbots & IRC) contains a complete (lengthy) list of all msg-id tags that apply to the NOTICE (Twitch Commands) and NOTICE (Twitch Chat Rooms) commands.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Twitch IRC Capability: msd-ID Tags: This new document (under Chatbots & IRC) contains a complete (lengthy) list of all msg-id tags that apply to the NOTICE (Twitch Commands) and NOTICE (Twitch Chat Rooms) commands.

\n\n

Extensions Reference: New JWT schema field, is_unlinked.

\n\n

New Twitch API Reference: New description and example in Get Webhook Subscriptions, which requires a Bearer token.

\n","url":"/changelog/2018-11-02.html","relative_path":"_changelog/2018-11-02.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 11 14","slug":"2018-11-14","ext":".md","tags":[],"excerpt":"

Apps & Authentication: Getting Tokens: OIDC: Added claims and UserInfo endpoint.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Apps & Authentication: Getting Tokens: OIDC: Added claims and UserInfo endpoint.

\n\n

Chatbots & IRC Guide: Added scopes for /vip, /unvip, and /vips commands.

\n\n

Chatbots & IRC: Twitch Tags: In USERNOTICE, added anonsubgift.

\n\n

PubSub Guide: Added sample message for anonsubgift.

\n","url":"/changelog/2018-11-14.html","relative_path":"_changelog/2018-11-14.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 11 27","slug":"2018-11-27","ext":".md","tags":[],"excerpt":"

Getting Started with Extensions, Extensions Developer Rig: Deleted information about the Developer Rig “local mode” (no longer available).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started with Extensions, Extensions Developer Rig: Deleted information about the Developer Rig “local mode” (no longer available).

\n","url":"/changelog/2018-11-27.html","relative_path":"_changelog/2018-11-27.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 11 28","slug":"2018-11-28","ext":".md","tags":[],"excerpt":"

Company Management: New document on registering companies and managing users in them. Company registration is required before you can manage games on Twitch or create Drops campaigns.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Company Management: New document on registering companies and managing users in them. Company registration is required before you can manage games on Twitch or create Drops campaigns.

\n","url":"/changelog/2018-11-28.html","relative_path":"_changelog/2018-11-28.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 11 30","slug":"2018-11-30","ext":".md","tags":[],"excerpt":"

Extensions Reference: Moved Bits-related reference information (JS helper functions) here, to consolidate all Extensions reference info in one place. The Bits in Extensions document is now purely a guide.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Reference: Moved Bits-related reference information (JS helper functions) here, to consolidate all Extensions reference info in one place. The Bits in Extensions document is now purely a guide.

\n","url":"/changelog/2018-11-30.html","relative_path":"_changelog/2018-11-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 12 17","slug":"2018-12-17","ext":".md","tags":[],"excerpt":"

Code Redemption API: New reference document.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Code Redemption API: New reference document.

\n","url":"/changelog/2018-12-17.html","relative_path":"_changelog/2018-12-17.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 12 19","slug":"2018-12-19","ext":".md","tags":[],"excerpt":"

Extensions Guidelines & Policies: New version of this doc.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Guidelines & Policies: New version of this doc.

\n","url":"/changelog/2018-12-19.html","relative_path":"_changelog/2018-12-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2018 12 21","slug":"2018-12-21","ext":".md","tags":[],"excerpt":"

Getting Started with Chatbots & IRC: New version of this doc.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started with Chatbots & IRC: New version of this doc.

\n","url":"/changelog/2018-12-21.html","relative_path":"_changelog/2018-12-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 01 17","slug":"2019-01-17","ext":".md","tags":[],"excerpt":"

New Twitch API Reference: Added new endpoints: Replace Stream Tags, Get Stream Tags, and Get All Stream Tags. Updated Get Streams endpoint to document new tags functionality.

\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API Reference: Added new endpoints: Replace Stream Tags, Get Stream Tags, and Get All Stream Tags. Updated Get Streams endpoint to document new tags functionality.

\n\n

Mobile Deep Links: Added deep links for category tags and live-stream tags.

\n\n

Insights & Analytics: Several clarifications, based on user feedback. Revised definitions of data fields that use device IDs. New section on “Counting Device IDs.”

\n","url":"/changelog/2019-01-17.html","relative_path":"_changelog/2019-01-17.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 01 18","slug":"2019-01-18","ext":".md","tags":[],"excerpt":"

Extensions Developer Rig: Added section on “Enabling 2FA.”

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Developer Rig: Added section on “Enabling 2FA.”

\n","url":"/changelog/2019-01-18.html","relative_path":"_changelog/2019-01-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 01 22","slug":"2019-01-22","ext":".md","tags":[],"excerpt":"

Extensions Reference: Added locale parameter to “Client Query Parameters.”

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Reference: Added locale parameter to “Client Query Parameters.”

\n","url":"/changelog/2019-01-22.html","relative_path":"_changelog/2019-01-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 01 28","slug":"2019-01-28","ext":".md","tags":[],"excerpt":"

Apps & Authentication: Clarified language around deprecation of Twitch API v. 5.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Apps & Authentication: Clarified language around deprecation of Twitch API v. 5.

\n\n

Getting Started with Extensions: Clarified using the native Developer Rig (beta).

\n","url":"/changelog/2019-01-28.html","relative_path":"_changelog/2019-01-28.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 01 30","slug":"2019-01-30","ext":".md","tags":[],"excerpt":"

Apps & Authentication: Added the scope channel:read:subscriptions.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Apps & Authentication: Added the scope channel:read:subscriptions.

\n\n

New Twitch API Reference: Added new endpoints: Get Broadcaster Subscriptions and Get User Subscriptions.

\n","url":"/changelog/2019-01-30.html","relative_path":"_changelog/2019-01-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 02 04","slug":"2019-02-04","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Tags: For USERNOTICE, added three fields (msg-param-cumulative-months, msg-param-should-share-streak, msg-param-streak-months) and changed when msg-param-months is sent.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Tags: For USERNOTICE, added three fields (msg-param-cumulative-months, msg-param-should-share-streak, msg-param-streak-months) and changed when msg-param-months is sent.

\n","url":"/changelog/2019-02-04.html","relative_path":"_changelog/2019-02-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 02 08","slug":"2019-02-08","ext":".md","tags":[],"excerpt":"

PubSub: Added topic channel-bits-events-v2. Removed deprecated months field. Added new cumulative-months and streak-months fields.

\n","date":"2021-10-12 22:12:21 +0000","content":"

PubSub: Added topic channel-bits-events-v2. Removed deprecated months field. Added new cumulative-months and streak-months fields.

\n","url":"/changelog/2019-02-08.html","relative_path":"_changelog/2019-02-08.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 02 21","slug":"2019-02-21","ext":".md","tags":[],"excerpt":"

Insights & Analytics: Added mod author analytics.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Insights & Analytics: Added mod author analytics.

\n","url":"/changelog/2019-02-21.html","relative_path":"_changelog/2019-02-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 07","slug":"2019-03-07","ext":".md","tags":[],"excerpt":"

Extensions doc set: Many changes. New version of Getting Started with Extensions. New Extensions manager UI (see Extensions Life Cycle Management).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions doc set: Many changes. New version of Getting Started with Extensions. New Extensions manager UI (see Extensions Life Cycle Management).

\n","url":"/changelog/2019-03-07.html","relative_path":"_changelog/2019-03-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 08","slug":"2019-03-08","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Tags: Deleted broadcaster-lang (from ROOMSTATE). Added several more valid values for the msg-id field (for USERNOTICE).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Tags: Deleted broadcaster-lang (from ROOMSTATE). Added several more valid values for the msg-id field (for USERNOTICE).

\n","url":"/changelog/2019-03-08.html","relative_path":"_changelog/2019-03-08.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 11","slug":"2019-03-11","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Tags: Added several more msg-param parameters (for USERNOTICE).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Tags: Added several more msg-param parameters (for USERNOTICE).

\n","url":"/changelog/2019-03-11.html","relative_path":"_changelog/2019-03-11.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 14","slug":"2019-03-14","ext":".md","tags":[],"excerpt":"

Websub: Updated documentation to make it clear that the order of query parameters matters.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Websub: Updated documentation to make it clear that the order of query parameters matters.

\n\n

Bits: Small edits to documentation, for clarity.

\n","url":"/changelog/2019-03-14.html","relative_path":"_changelog/2019-03-14.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 15","slug":"2019-03-15","ext":".md","tags":[],"excerpt":"

Extensions Reference: Added information related to Monetization.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Reference: Added information related to Monetization.

\n\n

Extensions Monetization Guide{: target=”_blank” (formerly Bits in Extensions), Extensions Life Cycle Management: Added Monetization tab to Extensions manager, for selecting Bits support and/or new subscription status support, and for going to the monetization onboarding process.

\n","url":"/changelog/2019-03-15.html","relative_path":"_changelog/2019-03-15.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 18","slug":"2019-03-18","ext":".md","tags":[],"excerpt":"

Getting Started with Extensions and Extensions Developer Rig: Changes based on the new Developer Rig UI. Updated “Hello World” example in Getting Started.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Getting Started with Extensions and Extensions Developer Rig: Changes based on the new Developer Rig UI. Updated “Hello World” example in Getting Started.

\n","url":"/changelog/2019-03-18.html","relative_path":"_changelog/2019-03-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 26","slug":"2019-03-26","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Tags: Added new badge-info parameter to GLOBALUSERSTATE, PRIVMSG, USERNOTICE, and USERSTATE.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Tags: Added new badge-info parameter to GLOBALUSERSTATE, PRIVMSG, USERNOTICE, and USERSTATE.

\n","url":"/changelog/2019-03-26.html","relative_path":"_changelog/2019-03-26.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 03 27","slug":"2019-03-27","ext":".md","tags":[],"excerpt":"

Chatbots & IRC: Twitch Tags: Added note that undocumented tags can be added/removed at any time. Also, tags may appear in any order. So, developers should write code to parse tags individually and ignore unrecognized tags.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Chatbots & IRC: Twitch Tags: Added note that undocumented tags can be added/removed at any time. Also, tags may appear in any order. So, developers should write code to parse tags individually and ignore unrecognized tags.

\n","url":"/changelog/2019-03-27.html","relative_path":"_changelog/2019-03-27.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 04 15","slug":"2019-04-15","ext":".md","tags":[],"excerpt":"

Video: Updated Video Upload Guide and Video Reference to note that you must be a Partner or Affiliate to upload VODs.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Video: Updated Video Upload Guide and Video Reference to note that you must be a Partner or Affiliate to upload VODs.

\n","url":"/changelog/2019-04-15.html","relative_path":"_changelog/2019-04-15.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 04 16","slug":"2019-04-16","ext":".md","tags":[],"excerpt":"

Deleted Communities Reference from v5 API because it is deprecated.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Deleted Communities Reference from v5 API because it is deprecated.

\n","url":"/changelog/2019-04-16.html","relative_path":"_changelog/2019-04-16.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 04 18","slug":"2019-04-18","ext":".md","tags":[],"excerpt":"

Updated link to download the Developer Rig for Windows.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated link to download the Developer Rig for Windows.

\n\n

Updated the v5 API Reference to indicate that the version is deprecated.

\n","url":"/changelog/2019-04-18.html","relative_path":"_changelog/2019-04-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"release_date":"2019-04-19 00:00:00 -0700","title":"2019 04 19","slug":"2019-04-19","ext":".md","tags":[],"excerpt":"

Removed note that Webhooks parameters must appear in alphabetical order because that restriction no longer exists.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed note that Webhooks parameters must appear in alphabetical order because that restriction no longer exists.

\n\n

Extensions Guidelines & Policies:

\n\n\n","url":"/changelog/2019-04-19.html","relative_path":"_changelog/2019-04-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 05 07","slug":"2019-05-07","ext":".md","tags":[],"excerpt":"

Fixed code formatting errors in several endpoints.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Fixed code formatting errors in several endpoints.

\n\n

Updated Configuration Service documentation.

\n\n

Removed Topic: Extension Analytics and Topic: Game Analytics from the Webhooks Reference because the endpoint is returning invalid data.

\n","url":"/changelog/2019-05-07.html","relative_path":"_changelog/2019-05-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 05 08","slug":"2019-05-08","ext":".md","tags":[],"excerpt":"

Removed orphan Bits Code Redemption Guide and added the content to the API Reference.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed orphan Bits Code Redemption Guide and added the content to the API Reference.

\n\n

Fixed date errors in the changelog.

\n","url":"/changelog/2019-05-08.html","relative_path":"_changelog/2019-05-08.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 05 30","slug":"2019-05-30","ext":".md","tags":[],"excerpt":"

Updated v5 API Guide: New third-party development will be limited to the API versions Kraken v5 and Helix. Limitation of new development will be enforced on client ID created on or after 5/31/2019.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated v5 API Guide: New third-party development will be limited to the API versions Kraken v5 and Helix. Limitation of new development will be enforced on client ID created on or after 5/31/2019.

\n","url":"/changelog/2019-05-30.html","relative_path":"_changelog/2019-05-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 04","slug":"2019-06-04","ext":".md","tags":[],"excerpt":"

Added Get Extension Transactions to the Twitch API Reference.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added Get Extension Transactions to the Twitch API Reference.

\n\n

Added Extension Transaction Created to the Webhooks Reference.

\n","url":"/changelog/2019-06-04.html","relative_path":"_changelog/2019-06-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 06","slug":"2019-06-06","ext":".md","tags":[],"excerpt":"

Extensions Guidelines & Policies:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Guidelines & Policies:

\n\n\n","url":"/changelog/2019-06-06.html","relative_path":"_changelog/2019-06-06.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 07","slug":"2019-06-07","ext":".md","tags":[],"excerpt":"

Removed deprecated Channel Feed API Reference.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed deprecated Channel Feed API Reference.

\n","url":"/changelog/2019-06-07.html","relative_path":"_changelog/2019-06-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 13","slug":"2019-06-13","ext":".md","tags":[],"excerpt":"

Extensions Life Cycle Management: Added section on Control Security Policy (CSP)

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions Life Cycle Management: Added section on Control Security Policy (CSP)

\n","url":"/changelog/2019-06-13.html","relative_path":"_changelog/2019-06-13.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 19","slug":"2019-06-19","ext":".md","tags":[],"excerpt":"

Added clarification to the Get Users endpoint in the Twitch API Reference that the limit of 100 IDs and login names is a total limit, not 100 of each.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added clarification to the Get Users endpoint in the Twitch API Reference that the limit of 100 IDs and login names is a total limit, not 100 of each.

\n\n

Changes to Helper Bits in the Extensions Reference:

\n\n\n","url":"/changelog/2019-06-19.html","relative_path":"_changelog/2019-06-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 20","slug":"2019-06-20","ext":".md","tags":[],"excerpt":"

Changed “position” to “policies” in Extensions: Guidelines and Policies, section 6.6.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Changed “position” to “policies” in Extensions: Guidelines and Policies, section 6.6.

\n","url":"/changelog/2019-06-20.html","relative_path":"_changelog/2019-06-20.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 21","slug":"2019-06-21","ext":".md","tags":[],"excerpt":"

Insights & Analytics updates (twice today)

\n","date":"2021-10-12 22:12:21 +0000","content":"

Insights & Analytics updates (twice today)

\n","url":"/changelog/2019-06-21.html","relative_path":"_changelog/2019-06-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 25","slug":"2019-06-25","ext":".md","tags":[],"excerpt":"

Documented the new Moderation API.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Documented the new Moderation API.

\n\n

Documented two new webhooks:

\n\n\n","url":"/changelog/2019-06-25.html","relative_path":"_changelog/2019-06-25.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 06 27","slug":"2019-06-27","ext":".md","tags":[],"excerpt":"

Added documentation for Get Subscription Events endpoint.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added documentation for Get Subscription Events endpoint.

\n\n

Added documentation for Subscription Events webhook.

\n","url":"/changelog/2019-06-27.html","relative_path":"_changelog/2019-06-27.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 09","slug":"2019-07-09","ext":".md","tags":[],"excerpt":"

Updated “Chatbots & IRC” docs (Getting Started, Guide, Membership, Commands, Tags, & Chat Rooms), except for “msg-ID Tags”.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated “Chatbots & IRC” docs (Getting Started, Guide, Membership, Commands, Tags, & Chat Rooms), except for “msg-ID Tags”.

\n\n

Updated all “Embed” docs (Introduction, Embed Chat, Embed Video & Clips, & Embed Everything).

\n","url":"/changelog/2019-07-09.html","relative_path":"_changelog/2019-07-09.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 18","slug":"2019-07-18","ext":".md","tags":[],"excerpt":"

DA-430: Add three new Extensions documents: Using A/B Testing in Extensions, Using Google Analytics in Extensions, and Increasing Feedback in Extensions. Also made minor change in Drops (meaning of “retries”).

\n","date":"2021-10-12 22:12:21 +0000","content":"

DA-430: Add three new Extensions documents: Using A/B Testing in Extensions, Using Google Analytics in Extensions, and Increasing Feedback in Extensions. Also made minor change in Drops (meaning of “retries”).

\n","url":"/changelog/2019-07-18.html","relative_path":"_changelog/2019-07-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 19","slug":"2019-07-19","ext":".md","tags":[],"excerpt":"

Retry adding 3 new Extensions docs (A/B Testing, Google Analytics, & Increasing Feedback)

\n","date":"2021-10-12 22:12:21 +0000","content":"

Retry adding 3 new Extensions docs (A/B Testing, Google Analytics, & Increasing Feedback)

\n","url":"/changelog/2019-07-19.html","relative_path":"_changelog/2019-07-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 22","slug":"2019-07-22","ext":".md","tags":[],"excerpt":"

Extensions update - reset file ordering

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions update - reset file ordering

\n","url":"/changelog/2019-07-22.html","relative_path":"_changelog/2019-07-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 29","slug":"2019-07-29","ext":".md","tags":[],"excerpt":"

Corrected URL for endpoint Get Moderator Events.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Corrected URL for endpoint Get Moderator Events.

\n","url":"/changelog/2019-07-29.html","relative_path":"_changelog/2019-07-29.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 30","slug":"2019-07-30","ext":".md","tags":[],"excerpt":"

Add RBAC information to Extensions Life Cycle Management and Monetization. 

\n","date":"2021-10-12 22:12:21 +0000","content":"

Add RBAC information to Extensions Life Cycle Management and Monetization. 

\n","url":"/changelog/2019-07-30.html","relative_path":"_changelog/2019-07-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 07 31","slug":"2019-07-31","ext":".md","tags":[],"excerpt":"

Added 2.10 and 2.11 to Extensions Guidelines and Policies.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added 2.10 and 2.11 to Extensions Guidelines and Policies.

\n\n

Updates to “Extensions: Designing” guide.

\n","url":"/changelog/2019-07-31.html","relative_path":"_changelog/2019-07-31.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 08 04","slug":"2019-08-04","ext":".md","tags":[],"excerpt":"

Add RBAC info to “Companies” (now “Organizations”)

\n","date":"2021-10-12 22:12:21 +0000","content":"

Add RBAC info to “Companies” (now “Organizations”)

\n","url":"/changelog/2019-08-04.html","relative_path":"_changelog/2019-08-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 08 05","slug":"2019-08-05","ext":".md","tags":[],"excerpt":"

Updated Organizations (formerly “Companies”).

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Organizations (formerly “Companies”).

\n\n

Updated Extensions: Developer Rig

\n\n

Updated Extensions: Increasing Feedback in Your Extension.

\n","url":"/changelog/2019-08-05.html","relative_path":"_changelog/2019-08-05.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 08 07","slug":"2019-08-07","ext":".md","tags":[],"excerpt":"

Update Mobile Deep Links

\n","date":"2021-10-12 22:12:21 +0000","content":"

Update Mobile Deep Links

\n","url":"/changelog/2019-08-07.html","relative_path":"_changelog/2019-08-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 08 14","slug":"2019-08-14","ext":".md","tags":[],"excerpt":"

Edited optional Create Stream Marker parameter description to include a max length of 140 characters.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Edited optional Create Stream Marker parameter description to include a max length of 140 characters.

\n\n

Removed “Increasing Feedback in Extensions”.

\n","url":"/changelog/2019-08-14.html","relative_path":"_changelog/2019-08-14.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 08 22","slug":"2019-08-22","ext":".md","tags":[],"excerpt":"

Edited the payload example in Topic: Subscription Events.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Edited the payload example in Topic: Subscription Events.

\n","url":"/changelog/2019-08-22.html","relative_path":"_changelog/2019-08-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 09 04","slug":"2019-09-04","ext":".md","tags":[],"excerpt":"

Added an updated Glossary.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added an updated Glossary.

\n","url":"/changelog/2019-09-04.html","relative_path":"_changelog/2019-09-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 09 06","slug":"2019-09-06","ext":".md","tags":[],"excerpt":"

Corrected msg_id parameter type in Check AutoMod Status from integer to string.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Corrected msg_id parameter type in Check AutoMod Status from integer to string.

\n","url":"/changelog/2019-09-06.html","relative_path":"_changelog/2019-09-06.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 09 10","slug":"2019-09-10","ext":".md","tags":[],"excerpt":"

Removed communities-related data fields from Get Streams and Get Streams Metadata endpoints. These fields are no longer supported.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed communities-related data fields from Get Streams and Get Streams Metadata endpoints. These fields are no longer supported.

\n\n

Merged Get Broadcaster’s Subscribers into Get Broadcaster Subscriptions because they both return the subscribers to a channel. 

\n\n

Added Load Testing Extensions Using Locust and Elastic Beanstalk document.

\n\n

Added Submission Best Practices for Extensions.

\n","url":"/changelog/2019-09-10.html","relative_path":"_changelog/2019-09-10.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 09 11","slug":"2019-09-11","ext":".md","tags":[],"excerpt":"

Added Increasing Feedback in Extensions.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added Increasing Feedback in Extensions.

\n","url":"/changelog/2019-09-11.html","relative_path":"_changelog/2019-09-11.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 09 28","slug":"2019-09-28","ext":".md","tags":[],"excerpt":"

Added links to the Developer Rig in these pages: 

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added links to the Developer Rig in these pages: 

\n\n\n","url":"/changelog/2019-09-28.html","relative_path":"_changelog/2019-09-28.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 10 16","slug":"2019-10-16","ext":".md","tags":[],"excerpt":"

Added Product Lifecycle page to the site.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added Product Lifecycle page to the site.

\n","url":"/changelog/2019-10-16.html","relative_path":"_changelog/2019-10-16.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 10 22","slug":"2019-10-22","ext":".md","tags":[],"excerpt":"

Updated review section in Extensions Life Cycle Management doc to include review SLA.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated review section in Extensions Life Cycle Management doc to include review SLA.

\n","url":"/changelog/2019-10-22.html","relative_path":"_changelog/2019-10-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 12 02","slug":"2019-12-02","ext":".md","tags":[],"excerpt":"

Updated the Getting Tokens OIDC doc to note that the email and email_verified claims will soon be gated by user:read:email scope.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the Getting Tokens OIDC doc to note that the email and email_verified claims will soon be gated by user:read:email scope.

\n","url":"/changelog/2019-12-02.html","relative_path":"_changelog/2019-12-02.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 12 05","slug":"2019-12-05","ext":".md","tags":[],"excerpt":"

Added chat rooms to the Product Lifecycle page as deprecated.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added chat rooms to the Product Lifecycle page as deprecated.

\n","url":"/changelog/2019-12-05.html","relative_path":"_changelog/2019-12-05.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 12 16","slug":"2019-12-16","ext":".md","tags":[],"excerpt":"

Added the Channel Points PubSub topic.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added the Channel Points PubSub topic.

\n","url":"/changelog/2019-12-16.html","relative_path":"_changelog/2019-12-16.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2019 12 17","slug":"2019-12-17","ext":".md","tags":[],"excerpt":"

Webhooks Reference

\n","date":"2021-10-12 22:12:21 +0000","content":"

Webhooks Reference

\n\n\n\n

Webhooks Guide

\n\n\n","url":"/changelog/2019-12-17.html","relative_path":"_changelog/2019-12-17.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 01 08","slug":"2020-01-08","ext":".md","tags":[],"excerpt":"

Extensions tutorials are now live on the site.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Extensions tutorials are now live on the site.

\n","url":"/changelog/2020-01-08.html","relative_path":"_changelog/2020-01-08.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 01 10","slug":"2020-01-10","ext":".md","tags":[],"excerpt":"\n","date":"2021-10-12 22:12:21 +0000","content":"\n","url":"/changelog/2020-01-10.html","relative_path":"_changelog/2020-01-10.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 01 24","slug":"2020-01-24","ext":".md","tags":[],"excerpt":"

Updates to PubSub documentation

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updates to PubSub documentation

\n\n\n","url":"/changelog/2020-01-24.html","relative_path":"_changelog/2020-01-24.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 02 13","slug":"2020-02-13","ext":".md","tags":[],"excerpt":"\n","date":"2021-10-12 22:12:21 +0000","content":"\n","url":"/changelog/2020-02-13.html","relative_path":"_changelog/2020-02-13.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 02 14","slug":"2020-02-14","ext":".md","tags":[],"excerpt":"

Updated the game_id parameter in the Get Streams endpoint from up to 100 IDs to up to 10 IDs.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the game_id parameter in the Get Streams endpoint from up to 100 IDs to up to 10 IDs.

\n\n

Documented the isBitsEnabled feature flag in the Extensions Reference.

\n\n

Removed the link to the deprecated form to increase webhook subscription limits.

\n\n

Added gifter_id and gifter_name fields to the Get Broadcaster Subscriptions endpoint and webhook.

\n","url":"/changelog/2020-02-14.html","relative_path":"_changelog/2020-02-14.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 02 25","slug":"2020-02-25","ext":".md","tags":[],"excerpt":"

Edited the following endpoints in the v. 5 API Reference:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Edited the following endpoints in the v. 5 API Reference:

\n\n\n\n

Edited the Get Game Analytics endpoint to note that we only return data for the previous 365 days.

\n\n

Updated documentation for the sunset of Premieres.

\n","url":"/changelog/2020-02-25.html","relative_path":"_changelog/2020-02-25.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 03 10","slug":"2020-03-10","ext":".md","tags":[],"excerpt":"

Updated the Extensions Guidelines & Policies to add Moderation.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the Extensions Guidelines & Policies to add Moderation.

\n","url":"/changelog/2020-03-10.html","relative_path":"_changelog/2020-03-10.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 03 18","slug":"2020-03-18","ext":".md","tags":[],"excerpt":"

Updates to the Embedding Twitch documentation: 

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updates to the Embedding Twitch documentation: 

\n\n\n","url":"/changelog/2020-03-18.html","relative_path":"_changelog/2020-03-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 03 27","slug":"2020-03-27","ext":".md","tags":[],"excerpt":"

Published new Extensions Guide.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Published new Extensions Guide.

\n","url":"/changelog/2020-03-27.html","relative_path":"_changelog/2020-03-27.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 03 30","slug":"2020-03-30","ext":".md","tags":[],"excerpt":"

Updated definition of “language” in v5 Streams API Reference.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated definition of “language” in v5 Streams API Reference.

\n","url":"/changelog/2020-03-30.html","relative_path":"_changelog/2020-03-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 04 01","slug":"2020-04-01","ext":".md","tags":[],"excerpt":"

Deleted documentation of these deprecated v5 endpoints: 

\n","date":"2021-10-12 22:12:21 +0000","content":"

Deleted documentation of these deprecated v5 endpoints: 

\n\n\n\n

Corrected URL for Get Extension Transaction endpoint.

\n","url":"/changelog/2020-04-01.html","relative_path":"_changelog/2020-04-01.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 04 20","slug":"2020-04-20","ext":".md","tags":[],"excerpt":"

Updated Drops documentation to align with UI changes.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Drops documentation to align with UI changes.

\n","url":"/changelog/2020-04-20.html","relative_path":"_changelog/2020-04-20.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 04 27","slug":"2020-04-27","ext":".md","tags":[],"excerpt":"

Updated Extensions Best Practices: 

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Extensions Best Practices: 

\n\n\n\n

Updated the Extensions Guidelines and Policies page for Content and Commerce.

\n","url":"/changelog/2020-04-27.html","relative_path":"_changelog/2020-04-27.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 05 01","slug":"2020-05-01","ext":".md","tags":[],"excerpt":"

Updated the Twitch API Reference to reflect that OAuth is now mandated.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the Twitch API Reference to reflect that OAuth is now mandated.

\n\n

Updated the Authentication Guide to include new OAuth scopes. 

\n\n

Updated the Webhooks Reference to show that authorization is now required authorization for every web hook.

\n","url":"/changelog/2020-05-01.html","relative_path":"_changelog/2020-05-01.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 05 04","slug":"2020-05-04","ext":".md","tags":[],"excerpt":"

Fixed a bug in the API Reference. The optional scope for the Get Users endpoint should be user:read:email.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Fixed a bug in the API Reference. The optional scope for the Get Users endpoint should be user:read:email.

\n","url":"/changelog/2020-05-04.html","relative_path":"_changelog/2020-05-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 05 08","slug":"2020-05-08","ext":".md","tags":[],"excerpt":"

Drops Guide: Updated Create Entitlement Grants Upload URL example to include Client ID.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Drops Guide: Updated Create Entitlement Grants Upload URL example to include Client ID.

\n\n

API Reference: Updated all example requests to include Client ID and token in Authorization header, as per new OAuth requirement.

\n","url":"/changelog/2020-05-08.html","relative_path":"_changelog/2020-05-08.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 05 12","slug":"2020-05-12","ext":".md","tags":[],"excerpt":"

Removed documentation of MODE and NAMES in the IRC documentation because they have not functioned correctly for some time and will not be supported.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed documentation of MODE and NAMES in the IRC documentation because they have not functioned correctly for some time and will not be supported.

\n","url":"/changelog/2020-05-12.html","relative_path":"_changelog/2020-05-12.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 06 03","slug":"2020-06-03","ext":".md","tags":[],"excerpt":"

Clarified the definition of Subscription denied in the Webhooks Guide.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Clarified the definition of Subscription denied in the Webhooks Guide.

\n","url":"/changelog/2020-06-03.html","relative_path":"_changelog/2020-06-03.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 06 15","slug":"2020-06-15","ext":".md","tags":[],"excerpt":"

Added links to rate limits documentation to the API Reference.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added links to rate limits documentation to the API Reference.

\n","url":"/changelog/2020-06-15.html","relative_path":"_changelog/2020-06-15.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 06 18","slug":"2020-06-18","ext":".md","tags":[],"excerpt":"

Added new endpoints to the API Reference and Webhooks Reference:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added new endpoints to the API Reference and Webhooks Reference:

\n\n\n\n

Added new functionality to the API: the Hype Train API.

\n","url":"/changelog/2020-06-18.html","relative_path":"_changelog/2020-06-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"date":"2020-06-22 00:00:00 +0000","title":"1","slug":"1","ext":".md","tags":[],"excerpt":"

Bug fixes in the API Reference.

\n","content":"

Bug fixes in the API Reference.

\n","url":"/changelog/2020-06-22-1.html","relative_path":"_changelog/2020-06-22-1.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 06 22","slug":"2020-06-22","ext":".md","tags":[],"excerpt":"

Updated the Authentication Guide to mention that developers can provide multiple redirect URIs.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the Authentication Guide to mention that developers can provide multiple redirect URIs.

\n","url":"/changelog/2020-06-22.html","relative_path":"_changelog/2020-06-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 07 01","slug":"2020-07-01","ext":".md","tags":[],"excerpt":"

Added new fields to the Channel Subscriptions Event Pubsub topic and a new USERNOTICE tag parameter in support of Multi-Month Subscription Gifting.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added new fields to the Channel Subscriptions Event Pubsub topic and a new USERNOTICE tag parameter in support of Multi-Month Subscription Gifting.

\n","url":"/changelog/2020-07-01.html","relative_path":"_changelog/2020-07-01.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 07 06","slug":"2020-07-06","ext":".md","tags":[],"excerpt":"

Added required authorization for the Get Streams endpoint and updated sample code.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added required authorization for the Get Streams endpoint and updated sample code.

\n","url":"/changelog/2020-07-06.html","relative_path":"_changelog/2020-07-06.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 07 21","slug":"2020-07-21","ext":".md","tags":[],"excerpt":"

Addressed issues in the API reference for the following endpoints:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Addressed issues in the API reference for the following endpoints:

\n\n\n","url":"/changelog/2020-07-21.html","relative_path":"_changelog/2020-07-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 07 23","slug":"2020-07-23","ext":".md","tags":[],"excerpt":"

Updated Extensions documentation to reflect new process for required review channels.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Extensions documentation to reflect new process for required review channels.

\n","url":"/changelog/2020-07-23.html","relative_path":"_changelog/2020-07-23.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"date":"2020-07-30 00:00:00 +0000","title":"1","slug":"1","ext":".md","tags":[],"excerpt":"

Updated Webhooks documentation to describe notification timeout.

\n","content":"

Updated Webhooks documentation to describe notification timeout.

\n\n

Changed documentation of Start Commercial response field from retryAfter to retry_after.

\n","url":"/changelog/2020-07-30-1.html","relative_path":"_changelog/2020-07-30-1.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 07 30","slug":"2020-07-30","ext":".md","tags":[],"excerpt":"

Updated Marketing and Developer User Roles.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Marketing and Developer User Roles.

\n","url":"/changelog/2020-07-30.html","relative_path":"_changelog/2020-07-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 08 13","slug":"2020-08-13","ext":".md","tags":[],"excerpt":"

Added a new section to our Extension Submission Best Practices: Template for a helpful Walkthrough Guide and Change Log

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added a new section to our Extension Submission Best Practices: Template for a helpful Walkthrough Guide and Change Log

\n","url":"/changelog/2020-08-13.html","relative_path":"_changelog/2020-08-13.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 08 18","slug":"2020-08-18","ext":".md","tags":[],"excerpt":"\n","date":"2021-10-12 22:12:21 +0000","content":"\n","url":"/changelog/2020-08-18.html","relative_path":"_changelog/2020-08-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 08 20","slug":"2020-08-20","ext":".md","tags":[],"excerpt":"

Updated Authorization section for the Get Clips endpoint to indicate that a user access token is required.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated Authorization section for the Get Clips endpoint to indicate that a user access token is required.

\n","url":"/changelog/2020-08-20.html","relative_path":"_changelog/2020-08-20.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 08 21","slug":"2020-08-21","ext":".md","tags":[],"excerpt":"

Fixed code sample for Events-based Drops.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Fixed code sample for Events-based Drops.

\n","url":"/changelog/2020-08-21.html","relative_path":"_changelog/2020-08-21.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 08 25","slug":"2020-08-25","ext":".md","tags":[],"excerpt":"

Updated the API Reference to note that the clips service returns a maximum of 1000 clips.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the API Reference to note that the clips service returns a maximum of 1000 clips.

\n\n

Removed the deprecated information about rate limits when there is no token from the API Guide.

\n\n

Added pagination information to the Get Drops Entitlements endpoint documentation.

\n","url":"/changelog/2020-08-25.html","relative_path":"_changelog/2020-08-25.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 08 28","slug":"2020-08-28","ext":".md","tags":[],"excerpt":"

Removed mention of a webhook for Drops because it is not yet available.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed mention of a webhook for Drops because it is not yet available.

\n","url":"/changelog/2020-08-28.html","relative_path":"_changelog/2020-08-28.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 09 07","slug":"2020-09-07","ext":".md","tags":[],"excerpt":"

Documented authentication and Join rate limits for chat.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Documented authentication and Join rate limits for chat.

\n\n

Removed documentation for chat rooms, because the feature is deprecated.

\n\n

 

\n\n

 

\n","url":"/changelog/2020-09-07.html","relative_path":"_changelog/2020-09-07.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 09 12","slug":"2020-09-12","ext":".md","tags":[],"excerpt":"

Added discussion of subscription status support to the Extensions Monetization documentation.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added discussion of subscription status support to the Extensions Monetization documentation.

\n\n

Clarified language in the Create Clip endpoint documentation.

\n","url":"/changelog/2020-09-12.html","relative_path":"_changelog/2020-09-12.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 09 14","slug":"2020-09-14","ext":".md","tags":[],"excerpt":"

Updated the following endpoints to make clear they are about Bits codes:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated the following endpoints to make clear they are about Bits codes:

\n\n\n\n

Updated Extensions documentation to say that layout needs to accommodate variable height rather than fixed at 700 pixels.

\n","url":"/changelog/2020-09-14.html","relative_path":"_changelog/2020-09-14.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 09 15","slug":"2020-09-15","ext":".md","tags":[],"excerpt":"

Edited all documentation to replace the terms “blacklist” and “whitelist” with “denylist” and “allowlist”.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Edited all documentation to replace the terms “blacklist” and “whitelist” with “denylist” and “allowlist”.

\n\n

Edited and redesigned the top-level page:

\n\n\n\n

Added to the Get Clips endpoint documentation that clips are returned sorted by view count, in descending order.

\n","url":"/changelog/2020-09-15.html","relative_path":"_changelog/2020-09-15.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 09 17","slug":"2020-09-17","ext":".md","tags":[],"excerpt":"

Added to the v5 API Get Channel Subscribers endpoint the information that if a user in the subscribers list has been banned, the subscription information will be provided, but the user object will have a value of null.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added to the v5 API Get Channel Subscribers endpoint the information that if a user in the subscribers list has been banned, the subscription information will be provided, but the user object will have a value of null.

\n","url":"/changelog/2020-09-17.html","relative_path":"_changelog/2020-09-17.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 09 23","slug":"2020-09-23","ext":".md","tags":[],"excerpt":"

Removed links to internal documents in Increase Feedback in Extensions.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed links to internal documents in Increase Feedback in Extensions.

\n","url":"/changelog/2020-09-23.html","relative_path":"_changelog/2020-09-23.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 10 09","slug":"2020-10-09","ext":".md","tags":[],"excerpt":"

Updates to the API Reference:

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updates to the API Reference:

\n\n\n\n

Fixed a typo in the channel:manage:broadcast scope.

\n\n

Removed the Glossary.

\n","url":"/changelog/2020-10-09.html","relative_path":"_changelog/2020-10-09.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 10 26","slug":"2020-10-26","ext":".md","tags":[],"excerpt":"

API Reference:

\n","date":"2021-10-12 22:12:21 +0000","content":"

API Reference:

\n\n\n\n

Authentication Guide:

\n\n\n\n

Clarified instructions for supplying parameters in the Webhooks Reference.

\n\n

Clarified limits in the Webhooks Guide.

\n\n

In the Extensions Guide, corrected the environment variable HTTPS=true for create-react-app.

\n\n

 

\n","url":"/changelog/2020-10-26.html","relative_path":"_changelog/2020-10-26.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 10 29","slug":"2020-10-29","ext":".md","tags":[],"excerpt":"

Removed CurseForge references from docs.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Removed CurseForge references from docs.

\n\n

API Reference:

\n\n\n\n

Pub Sub:

\n\n\n","url":"/changelog/2020-10-29.html","relative_path":"_changelog/2020-10-29.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 11 04","slug":"2020-11-04","ext":".md","tags":[],"excerpt":"

Added information about Drops Analytics to documentation.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added information about Drops Analytics to documentation.

\n","url":"/changelog/2020-11-04.html","relative_path":"_changelog/2020-11-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 11 13","slug":"2020-11-13","ext":".md","tags":[],"excerpt":"

Added documentation for EventSub.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added documentation for EventSub.

\n\n

Added Channel Points API to the API Reference.

\n\n

Added a v5 to Twitch API migration guide.

\n","url":"/changelog/2020-11-13.html","relative_path":"_changelog/2020-11-13.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 11 19","slug":"2020-11-19","ext":".md","tags":[],"excerpt":"

Corrections and edits to the EventSub documentation.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Corrections and edits to the EventSub documentation.

\n\n

Updated Drops Analytics image.

\n\n

Changed type for pagination response field to be “object containing a string”.

\n\n

Corrections and edits to scopes documentation.

\n","url":"/changelog/2020-11-19.html","relative_path":"_changelog/2020-11-19.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 11 30","slug":"2020-11-30","ext":".md","tags":[],"excerpt":"

Corrections and edits to the EventSub documentation.\nFixed a typo for “msg-param-gift-months” under IRC usernotices.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Corrections and edits to the EventSub documentation.\nFixed a typo for “msg-param-gift-months” under IRC usernotices.

\n","url":"/changelog/2020-11-30.html","relative_path":"_changelog/2020-11-30.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 12 01","slug":"2020-12-01","ext":".md","tags":[],"excerpt":"

Added progress field to Hype Train EventSub subscription types.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Added progress field to Hype Train EventSub subscription types.

\n","url":"/changelog/2020-12-01.html","relative_path":"_changelog/2020-12-01.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 12 04","slug":"2020-12-04","ext":".md","tags":[],"excerpt":"

UserVoice feedback fixes:

\n\n","date":"2021-10-12 22:12:21 +0000","content":"

UserVoice feedback fixes:

\n\n\n

Miscellaneous fixes:

\n\n","url":"/changelog/2020-12-04.html","relative_path":"_changelog/2020-12-04.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 12 17","slug":"2020-12-17","ext":".md","tags":[],"excerpt":"

Details for retriving ingest servers have been moved to the top-level Video Broadcasting section. This includes the launch of “Get Ingest Servers” to replace its deprecated version previously found in v5.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Details for retriving ingest servers have been moved to the top-level Video Broadcasting section. This includes the launch of “Get Ingest Servers” to replace its deprecated version previously found in v5.

\n","url":"/changelog/2020-12-17.html","relative_path":"_changelog/2020-12-17.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2020 12 18","slug":"2020-12-18","ext":".md","tags":[],"excerpt":"

Updated auth validation sample with values and the expires_in field.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Updated auth validation sample with values and the expires_in field.

\n\n

Updated JavaScript helper examples to use window.Twitch.ext.

\n\n

Clarifcation for linking accounts for time-based Drops.

\n\n

Miscellaneous API reference fixes.

\n","url":"/changelog/2020-12-18.html","relative_path":"_changelog/2020-12-18.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 01 08","slug":"2021-01-08","ext":".md","tags":[],"excerpt":"

EventSub updates:

\n\n","date":"2021-10-12 22:12:21 +0000","content":"

EventSub updates:

\n\n\n

Added twitch://broadcast mobile deeplink to broadcast a specific category.

\n\n

Embed updates:

\n\n\n

Feedback and bug reports:

\n\n","url":"/changelog/2021-01-08.html","relative_path":"_changelog/2021-01-08.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 01 15","slug":"2021-01-15","ext":".md","tags":[],"excerpt":"

New Twitch API endpoints available:

\n\n","date":"2021-10-12 22:12:21 +0000","content":"

New Twitch API endpoints available:

\n\n\n

The new scopes for these endpoints have also been added to Authentication. Updated the descriptions of existing scopes for consistency and accuracy.

\n\n\n

v5 migration guide updates:

\n\n\n

giantbomb_id set to 0 in the v5 Get Top Games response example to reflect a game data migration.

\n","url":"/changelog/2021-01-15.html","relative_path":"_changelog/2021-01-15.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 01 22","slug":"2021-01-22","ext":".md","tags":[],"excerpt":"

EventSub:

\n\n","date":"2021-10-12 22:12:21 +0000","content":"

EventSub:

\n\n\n

Authentication updates:

\n\n\n

Additional updates:

\n\n","url":"/changelog/2021-01-22.html","relative_path":"_changelog/2021-01-22.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 01 28","slug":"2021-01-28","ext":".md","tags":[],"excerpt":"

broadcaster_login and/or user_login added to multiple API endpoint payloads that already return user ID and display name.

\n","date":"2021-10-12 22:12:21 +0000","content":"

broadcaster_login and/or user_login added to multiple API endpoint payloads that already return user ID and display name.

\n\n\n","url":"/changelog/2021-01-28.html","relative_path":"_changelog/2021-01-28.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 01 29","slug":"2021-01-29","ext":".md","tags":[],"excerpt":"

EventSub

\n\n","date":"2021-10-12 22:12:21 +0000","content":"

EventSub

\n\n\n

A note about removing Extensions Policy 7.5 has been added since Twitch Extensions no longer load for banned users.

\n\n

The Drops guide now includes a section regarding thoughtful naming of campaigns and rewards.

\n\n

Product Lifecycle has been updated to include definitions for tagging functionality in the documentation.

\n","url":"/changelog/2021-01-29.html","relative_path":"_changelog/2021-01-29.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 02 05","slug":"2021-02-05","ext":".md","tags":[],"excerpt":"

Eventsub API endpoints have been moved to the API reference.

\n","date":"2021-10-12 22:12:21 +0000","content":"

Eventsub API endpoints have been moved to the API reference.

\n\n

A message regarding the deprecation of Twitch Quarterly Insights has been added to Insights following the recent announcement.

\n\n

Explicitly stating in Extensions that files should be zipped together as opposed to zipping the directory containing the files.

\n\n

Miscellaneous UserVoice and GitHub Issues addressed.

\n","url":"/changelog/2021-02-05.html","relative_path":"_changelog/2021-02-05.md","permalink":null},{"draft":false,"categories":[],"layout":"default","_options":{"content":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"content_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true},"text_html":{"uploads_dir":"/images/uploads/:title","width":1920,"height":1200,"format":"p feature-heading h1 h2 h3 h4 h5 h6 div blue","styles":"/assets/css/custom-styles.css","undo":true,"redo":true,"left":"align-to-left","center":"align-to-center","right":"align-to-right","justify":"justify","bold":true,"italic":true,"underline":true,"strike":true,"subscript":false,"superscript":false,"blockquote":true,"table":true,"copyformatting":true,"removeformat":true,"numberedlist":true,"bulletedlist":true,"outdent":false,"indent":false,"image":true,"link":true,"embed":true}},"title":"2021 02 09","slug":"2021-02-09","ext":".md","tags":[],"excerpt":"

In EventSub, the authorization scopes allowed for all Channel Point subscription types have been updated to accept channel:read:redemptions or channel:manage:redemptions.

\n","date":"2021-10-12 22:12:21 +0000","content":"

In EventSub, the authorization scopes allowed for all Channel Point subscription types have been updated to accept channel:read:redemptions or channel:manage:redemptions.

\n\n

Updated Get Users to correctly document created_at in the example.

\n\n

Minor editorial updates to the Extensions Monetization Guide.

\n","url":"/changelog/2021-02-09.html","relative_path":"_changelog/2021-02-09.md","permalink":null}],"data":{"general_settings":{"site_title":"Twitch Developers","SEO":{"site_description":"Live Streaming, Meet Developers.","social_media_image":null,"google_analytics_id":"UA-23719667-9"}},"solution_types":["Broadcaster","Game"],"footer":{"sitemap_groups":[{"heading":"What We Do","links":[{"link_label":"Stream","link_url":"https://www.twitch.tv/p/stream/","open_in_new_tab":false},{"link_label":"Watch","link_url":"https://www.twitch.tv/p/watch/","open_in_new_tab":false},{"link_label":"Develop","link_url":"https://dev.twitch.tv/","open_in_new_tab":false},{"link_label":"Advertise","link_url":"https://twitchadvertising.tv/","open_in_new_tab":false},{"link_label":"twitch.tv","link_url":"https://twitch.tv/","open_in_new_tab":false,"arrow_direction":"↗"}]},{"heading":"Company","links":[{"link_label":"Jobs","link_url":"https://www.twitch.tv/jobs/","open_in_new_tab":false},{"link_label":"Merch","link_url":"https://twitch.tv/store","open_in_new_tab":false},{"link_label":"Brand","link_url":"https://www.twitch.tv/p/brand","open_in_new_tab":false},{"link_label":"TwitchCon","link_url":"https://www.twitchcon.com/","open_in_new_tab":false},{"link_label":"Meetups","link_url":"https://meetups.twitch.tv/","open_in_new_tab":false}]},{"heading":"Newsroom","links":[{"link_label":"News","link_url":"https://www.twitch.tv/p/about/news/","open_in_new_tab":false},{"link_label":"Press","link_url":"https://www.twitch.tv/p/about/press-releases/","open_in_new_tab":false}]},{"heading":"Products","links":[{"link_label":"Bits","link_url":"https://www.twitch.tv/bits","open_in_new_tab":false},{"link_label":"Subs","link_url":"https://www.twitch.tv/subs","open_in_new_tab":false},{"link_label":"Turbo","link_url":"https://www.twitch.tv/turbo","open_in_new_tab":false},{"link_label":"Prime","link_url":"https://www.twitch.tv/prime","open_in_new_tab":false},{"link_label":"Extensions","link_url":"https://www.twitch.tv/p/extensions/","open_in_new_tab":false},{"link_label":"Sings","link_url":"https://sings.twitch.tv/","open_in_new_tab":false}]},{"heading":"Resources","links":[{"link_label":"Legal","link_url":"https://www.twitch.tv/p/legal/","open_in_new_tab":false},{"link_label":"Help Center","link_url":"https://help.twitch.tv/","open_in_new_tab":false},{"link_label":"Security","link_url":"https://www.twitch.tv/p/security/","open_in_new_tab":false}]},{"heading":"Connect","links":[{"link_label":"Twitter","link_url":"https://twitter.com/twitch","open_in_new_tab":false},{"link_label":"Facebook","link_url":"https://www.facebook.com/twitch/","open_in_new_tab":false},{"link_label":"Instagram","link_url":"https://www.instagram.com/twitch/","open_in_new_tab":false}]}],"general_navigation_links":[{"link_label":"Terms of service","link_URL":"https://www.twitch.tv/p/legal/terms-of-service/","open_in_new_tab":false},{"link_label":"Privacy Policy","link_URL":"https://www.twitch.tv/p/legal/privacy-policy/","open_in_new_tab":false},{"link_label":"Ad Choices","link_URL":"https://www.twitch.tv/p/legal/ad-choices/","open_in_new_tab":false},{"link_label":"Cookie Policy","link_URL":"https://www.twitch.tv/p/legal/cookie-policy/","open_in_new_tab":false},{"link_label":"Partners","link_URL":"https://www.twitch.tv/p/partners/","open_in_new_tab":false},{"link_label":"Affiliates","link_URL":"https://affiliate.twitch.tv/","open_in_new_tab":false}],"legal_text":"Twitch Interactive, Inc."},"docs-structure":{"root":{"_type":"group","items":[{"_type":"items","articles":["index"],"article_objects":["\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
\n\t
\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
\n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
\n\t\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    What’s new?
    \n\t\t\n\t\t\t
    What’s popular?
    \n\t\t\n\t\t\t
    Give Feedback and Get Help
    \n\t\t\n\t\t\t
    Terms of Use
    \n\t\t\n\t\n\n\n\t\t

    Twitch Developer Documentation

    \n\n

    Welcome to our documentation site! Here you’ll find the information you need to develop experiences on Twitch.

    \n\n

    What’s new?

    \n\n

    These docs have been most recently updated:

    \n\n\n\n

    What’s popular?

    \n\n

    Some popular reading:

    \n\n\n\n

    Give Feedback and Get Help

    \n\n

    For help using our developer tools or to let us know about product or documentation issues:

    \n\n\n\n

    Terms of Use

    \n\n

    By accessing or using Twitch API, you agree to comply with and be bound by the Twitch Developer Services Agreement. If you do not agree to be bound by the Twitch Developer Agreement, do not access or otherwise use the Twitch API.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n"]},{"_type":"group","name":"Authentication","items":[{"_type":"items","articles":["authentication","getting-tokens-oauth","getting-tokens-oidc"],"article_objects":["\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Validating requests
    \n\t\t\n\t\t\t
    Registration
    \n\t\t\n\t\t\t
    Types of tokens
    \n\t\t\n\t\t\t
    Getting tokens
    \n\t\t\n\t\t\t
    Sending user access and app access tokens
    \n\t\t\n\t\t\t
    Revoking access tokens
    \n\t\t\n\t\t\t
    Refreshing access tokens
    \n\t\t\n\t\t\t
    Scopes
    \n\t\t\n\t\n\n\n\t\t

    Authentication

    \n\n

    Introduction

    \n\n

    This guide describes how to use Twitch Authentication to enable your application to take actions on behalf of a Twitch account or access certain data about users’ accounts. The preferred method of authentication is OAuth. We use parts of the OAuth 2.0 protocol.

    \n\n

    In addition to OAuth, Twitch supports OIDC (OpenID Connect) for a more secure OAuth 2.0 flow. OIDC tokens are compatible with services built for OIDC compliance, such as Cognito by Amazon Web Services.

    \n\n

    Authentication involves:

    \n\n
      \n
    1. \nRegistering your app to obtain a client ID and client secret.
    2. \n
    3. \nGetting a token. This includes specifying scopes, the permissions your app requires.
    4. \n
    5. \nSending the token in your API request, to authenticate API requests.
    6. \n
    \n\n

    Code samples are available for Go and Node.js.

    \n\n

    Warning: Treat your token like a password. For example, never use access tokens in any public URL, and never display tokens on any web page without requiring a click to de-obfuscate.

    \n\n

    Validating requests

    \n\n

    If you use Twitch authentication for login purposes only, access tokens should be validated on a recurring interval. Periodic validation of previously issued OAuth tokens ensures that users who authorized your application have not decided to disconnect the integration.

    \n\n

    You must validate access tokens before making API requests which perform mutations on or access sensitive information of users, if it has been more than one hour since the last validation.

    \n\n

    Twitch periodically conducts audits. If we discover an application that is not re-validating access tokens (that is, an application that validates only for login and not thereafter), we will reach out and work with developers to resolve the issue. If the issue is not resolved, we may take punitive action, such as revoking the developer’s API key or throttling the application’s performance.

    \n\n

    Validation is important because of how OAuth access tokens work and the end user’s expectation of OAuth session control. For example, users who opt to disconnect your integration from their Twitch accounts can do so from their account settings on Twitch. When a user disconnects from an integration, all OAuth tokens between that user and that integration are invalidated. In this scenario, the expectation is that OAuth tokens are tied to sessions on third-party services; as such, any existing sessions between the disconnected user and those services also should be invalidated.

    \n\n

    When validating each of your requests, submit a request to the validation endpoint (https://id.twitch.tv/oauth2/validate) with your OAuth token in the header. If you are authenticated, the response includes the status of your token. A successful response indicates that your access token is valid.

    \n\n

    Here is a sample request:

    \n\n
    curl -H \"Authorization: OAuth <access token>\" https://id.twitch.tv/oauth2/validate\n
    \n\n

    And here is a sample response:

    \n\n
    {\n  \"client_id\": \"wbmytr93xzw8zbg0p1izqyzzc5mbiz\",\n  \"login\": \"twitchdev\",\n  \"scopes\": [\n    \"channel:read:subscriptions\"\n  ],\n  \"user_id\": \"141981764\",\n  \"expires_in\": 5520838\n}\n
    \n\n

    Registration

    \n\n

    To make an application that uses the Twitch API, you first need to register your application on the Twitch developer site. When creating this app, enter your redirect URI, which is where your users are redirected after being authorized. You can provide several redirect URIs, for example, if you wish to use the same client for different environments.

    \n\n

    Once you create a developer application, you are assigned a client ID. Some authentication flows also require a client secret, which you can generate on the same page as the client ID.

    \n\n
      \n
    • Client IDs are public and can be shared (for example, embedded in the source of a Web page).
    • \n
    • Client secrets are equivalent to a password for your application and must be kept confidential. Never expose it to users, even in an obscured form.
    • \n
    \n\n

    Because your client secret is confidential, we cannot show it to you once you leave the page, so make sure to record it somewhere safe. Also, generating a new client secret immediately invalidates the current one, which might make your API requests fail until your app is updated.

    \n\n

    Warning: Client IDs should be unique for each application: do not re-use client IDs across multiple applications. Also, applications should request the appropriate scopes for the intended target APIs. Failure to adhere to these guidelines may result in the suspension of your application’s access to the Twitch API.

    \n\n

    Types of tokens

    \n\n

    Twitch supports several types of tokens:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Token TypeDescription
    ID tokens (OIDC)A set of claims about the end user, for a given authorization. Using OIDC ID tokens (JWT) enables you to get details about your user (such as email address) for a particular authorization. These details are represented by claims in the ID token’s payload.

    Our discovery endpoint is at https://id.twitch.tv/oauth2/.well-known/openid-configuration. It can be used with standard OIDC clients like AWS Cognito.
    User access tokensAuthenticate users and allow your app to make requests on their behalf. If your application uses Twitch for login or makes requests in the context of an authenticated user, you need to generate a user access token.
    App access tokensAuthenticate your app and allow it to access resources that it owns. Since app access tokens are not associated with a user, they cannot be used with endpoints that require user authentication.

    Some Twitch API endpoints require application authentication (not user authentication). If your application uses these endpoints, you need to generate an app access token. App access tokens get client credentials (not user credentials). They enable you to make secure API requests that are not on behalf of a specific user. Client credentials also may be used in place of client ID headers to securely identify your application.

    App access tokens expire after about 60 days, so you should check that your app access token is valid by submitting a request to the validation endpoint (see Validating Requests). If your token has expired, generate a new one.

    App access tokens are meant only for server-to-server API requests and should never be included in client code.\n
    \n\n

    User access tokens and app access tokens are both bearer tokens. “Bearer” comes from the authorization header; see Sending User Access and App Access Tokens.

    \n\n

    Getting tokens

    \n\n

    The domain dedicated to Twitch authentication is https://id.twitch.tv.

    \n\n

    Note: URLs have been updated to replace https://api.twitch.tv/kraken with https://id.twitch.tv. Code that uses the old kraken domain for Twitch authentication will continue to work until the removal of Twitch API v. 5 functionality. Twitch API v. 5 is currently deprecated.

    \n\n

    We support several authentication flows:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Flow TypeDescription
    Implicit code flowYour app does not use a server, such as a client-side JavaScript app or mobile app. This approach does not require a server that must make requests to the API.
    Authorization code flowYour application uses a server, can securely store a client secret, and can make server-to-server requests.
    Client credentials flowYou need an app access token.
    \n\n

    The procedure you should use to get tokens depends on the type(s) of tokens you want:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ProcedureUser Access TokenID TokenApp Access Token
    OIDC Implicit Code Flow 
    OAuth Implicit Code Flow  
    OIDC Authorization Code Flow 
    OAuth Authorization Code Flow  
    OAuth Client Credentials Flow  
    \n\n

    For security purposes, examples in these sections use a fake access token, 0123456789abcdefghijABCDEFGHIJ.

    \n\n

    Sending user access and app access tokens

    \n\n

    When an API request requires authentication, send the access token as a header. The header differs, depending on which API you use:

    \n\n

    In the Twitch API:
    curl -H \"Authorization: Bearer <access token>\" https://api.twitch.tv/helix/

    \n\n

    In Twitch API v5 (deprecated ):
    curl -H \"Authorization: OAuth <access token>\" https://api.twitch.tv/kraken/

    \n\n

    Revoking access tokens

    \n\n

    To clean up previously obtained access tokens, use the Twitch OAuth token-revocation endpoint. The implementation follows the OAuth standard.

    \n\n

    On your server, revoke an access token by making this request:

    \n\n
    POST https://id.twitch.tv/oauth2/revoke\n    ?client_id=<your client ID>\n    &token=<your OAuth token>\n
    \n\n

    For example, using our previously authenticated user, the request is:

    \n\n
    POST https://id.twitch.tv/oauth2/revoke?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&token=0123456789abcdefghijABCDEFGHIJ\n
    \n\n

    This request also works for app access tokens. To revoke the app access token we created previously, make this request:

    \n\n
    POST https://id.twitch.tv/oauth2/revoke?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&token=prau3ol6mg5glgek8m89ec2s9q5i3i\n
    \n\n

    Successful requests return 200 OK with no body. Requests with invalid tokens return 400 Bad Request with an “Invalid token” message in the body of the response.

    \n\n

    Malformed requests return 400 Bad Request, along with information about how to fix the request, typically reminding the requester to include the client_id.

    \n\n

    Refreshing access tokens

    \n\n

    New OAuth2 access tokens have expirations. Token-expiration periods vary in length, based on how the token was acquired. Tokens return an expires_in field indicating how long the token should last. However, you should build your applications in such a way that they are resilient to token authentication failures. In other words, an application capable of refreshing tokens should not need to know how long a token will live. Rather, it should be prepared to deal with the token becoming invalid at any time.

    \n\n

    To allow for applications to remain authenticated for long periods in a world of expiring tokens, we allow for sessions to be refreshed, in accordance with the guidelines in “Refreshing an Access Token” in the OAuth2 RFC. Generally, refresh tokens are used to extend the lifetime of a given authorization.

    \n\n

    Note: App access tokens and ID tokens cannot be refreshed.

    \n\n

    How to refresh

    \n\n

    To refresh a token, you need an access token/refresh token pair coming from a body. For example:

    \n\n
    {\n  \"access_token\": \"0123456789abcdefghijABCDEFGHIJ\",\n  \"refresh_token\": \"eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\",\n  \"expires_in\": 3600,\n  \"scope\": \"viewing_activity_read\",\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    You also need the client_id and client_secret used to generate the above access token/refresh token pair

    \n\n

    To refresh, use this request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    --data-urlencode\n    ?grant_type=refresh_token\n    &refresh_token=<your refresh token>\n    &client_id=<your client ID>\n    &client_secret=<your client secret>\n
    \n\n

    There are several required parameters and one optional parameter:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParametersTypeDescription
    client_idstringYour client ID.
    client_secretstringYour client secret.
    grant_typestringMust be refresh_token.
    refresh_tokenstringRefresh token issued to the client.

    Your refresh token may contain characters that are not URL safe, so be sure to URL encode the characters of your refresh token before inserting it into the body of the refresh request. Otherwise, you may get an error (“Invalid refresh token”) when you try to refresh.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    scopestringSpace-separated list of scopes. This must be the entire set or any subset of the scopes assigned to the original token grant. It cannot include any scope not originally granted by the resource owner. Default: the entire set of scopes originally granted.
    \n\n

    Example:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    --data-urlencode\n    ?grant_type=refresh_token\n    &refresh_token=eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\n    &client_id=fooid\n    &client_secret=barbazsecret\n
    \n\n

    Here is a sample response on success. It contains the new access token, refresh token, and scopes associated with the new grant. Your application should then update its record of the refresh token to be the value provided in this response, as the refresh token may change between requests.

    \n\n
    {\n  \"access_token\": \"asdfasdf\",\n  \"refresh_token\": \"eyJfMzUtNDU0OC04MWYwLTQ5MDY5ODY4NGNlMSJ9%asdfasdf=\",\n  \"scope\": \"viewing_activity_read\"\n}\n
    \n\n

    Here is the body of an unsuccessful response:

    \n\n
    {\n  \"error\": \"Bad Request\",\n  \"status\": 400,\n  \"message\": \"Invalid refresh token\"\n}\n
    \n\n

    When a user changes their password or disconnects an app, we delete all tokens for that user. Both refresh and access tokens for that user will return 401 Unauth.

    \n\n

    Refresh in response to server rejection for bad authentication

    \n\n

    We recommend that you refresh your tokens in response to being rejected by the server for bad authentication. It is good practice to assume that your access token can expire or be revoked at any time, and refreshing reactively ensures that your application is prepared to deal with such situations as gracefully as possible. For this reason, refreshing in response to server rejection is preferable to refreshing proactively, on a fixed schedule.

    \n\n

    When you make a request with expired or incorrect authorization credentials, the API returns a 401 Unauthorized status:

    \n\n
    DELETE /kraken/users/test_user1/follows/channels/test_channel HTTP/1.1\nHost: api.twitch.tv\nUser-Agent: curl/7.43.0\nAccept: application/vnd.twitchtv.v3+json\nAuthorization: OAuth <access_token>\nClient-ID: retgzhvpsxjwun0rvrb1rfwheegu1yw\n\nHTTP/1.1 401 Unauthorized\nAccept-Ranges: bytes\nAccess-Control-Allow-Headers:\nAccess-Control-Allow-Methods:\nAccess-Control-Allow-Origin: *\nAge: 0\nCache-Control: max-age=0, private, must-revalidate\nContent-Type: application/json; charset=utf-8\nDate: Wed, 12 Oct 2016 22:25:10 GMT\nServer: nginx\nStatus: 401 Unauthorized\nVary: Accept-Encoding\nVia: 1.1 varnish\nContent-Length: 89\nConnection: keep-alive\n\n{\n    \"error\": \"Unauthorized\",\n    \"message\": \"Token invalid or missing required scope\",\n    \"status\": 401\n}\n
    \n\n

    On seeing a 401 error, an application should try to refresh the session if a refresh token is present. If the refresh fails, the application should re-prompt the end user with another authentication dialog via the standard OAuth 2 flow.

    \n\n

    Handling token refreshes in an application

    \n\n

    We recommend that you do access-token refreshes synchronously with respect to all consumers of a given access token. That is, do not send multiple, simultaneous refresh requests for the same token. Send one refresh request, then redistribute the new token that is returned from that request to all consumers, as appropriate.

    \n\n

    The API limits the number of active access tokens associated with a given refresh token. The limit is 50 token per client/user (that is, a user can only have 50 tokens live at a time per client ID). If multiple threads sharing the same authorization were to simultaneously refresh, some of them might not have working credentials at the end of the refresh. Synchronizing on the refresh operation prevents the application from inadvertently overrunning its limit.

    \n\n

    Scopes

    \n\n

    As mentioned above, when you request authorization from users, the URL scope parameter allows you to specify which permissions your app requires. These scopes are tied to the access token you receive on successful authorization. Without specifying scopes, your app can access only basic information about the authenticated user.

    \n\n

    Scopes are specified as a space-separated list in the URL scope parameter, when requesting authorization:

    \n\n

    &scope=user:edit%20user:read:email

    \n\n

    Ask for only the permissions you need, as users can view each requested permission when authorizing your app.

    \n\n

    No scopes are needed when requesting app access tokens.

    \n\n

    Twitch API

    \n\n

    Multiple scopes can be specified when requesting an OAuth or OIDC token. To see which endpoints can be used with these scopes, refer to the Twitch API reference.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Scope NameType of Access
    analytics:read:extensionsView analytics data for the Twitch Extensions owned by the authenticated account.
    analytics:read:gamesView analytics data for the games owned by the authenticated account.
    bits:readView Bits information for a channel.
    channel:edit:commercialRun commercials on a channel.
    channel:manage:broadcastManage a channel’s broadcast configuration, including updating channel configuration and managing stream markers and stream tags.
    channel:manage:extensionsManage a channel’s Extension configuration, including activating Extensions.
    channel:manage:redemptionsManage Channel Points custom rewards and their redemptions on a channel.
    channel:manage:videosManage a channel’s videos, including deleting videos.
    channel:read:editorsView a list of users with the editor role for a channel.
    channel:read:hype_trainView Hype Train information for a channel.
    channel:read:redemptionsView Channel Points custom rewards and their redemptions on a channel.
    channel:read:stream_keyView an authorized user’s stream key.
    channel:read:subscriptionsView a list of all subscribers to a channel and check if a user is subscribed to a channel.
    clips:editManage Clips for a channel.
    moderation:readView a channel’s moderation data including Moderators, Bans, Timeouts, and Automod settings.
    user:editManage a user object.
    user:edit:followsEdit a user’s follows.
    user:read:blocked_usersView the block list of a user.
    user:manage:blocked_usersManage the block list of a user.
    user:read:broadcastView a user’s broadcasting configuration, including Extension configurations.
    user:read:emailRead an authorized user’s email address.
    \n\n

    Legacy Twitch API v5

    \n\n

    With the deprecation of Twitch API v5, the scopes below have been mapped to Twitch API scopes for an easier migration between versions. You can find this mapping and information about equivalent endpoints on the Twitch API Migration Guide.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Scope NameType of Access
    channel_subscriptionsRead all subscribers to a channel.
    channel_commercialTrigger commercials on a channel.
    channel_editorWrite channel metadata (game, status, etc).
    user_follows_editManage a user’s followed channels.
    channel_readView a channel’s email address and stream key.
    user_readView a user’s information.
    user_blocks_readRead a user’s block list.
    user_blocks_editManage a user’s block list.
    \n\n

    Chat and PubSub

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Scope NameType of Access
    channel:moderatePerform moderation actions in a channel. The user requesting the scope must be a moderator in the channel.
    chat:editSend live stream chat and rooms messages.
    chat:readView live stream chat and rooms messages.
    whispers:readView your whisper messages.
    whispers:editSend whisper messages.
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    OAuth implicit code flow
    \n\t\t\n\t\t\t
    OAuth authorization code flow
    \n\t\t\n\t\t\t
    OAuth client credentials flow
    \n\t\t\n\t\n\n\n\t\t

    Getting Tokens: OAuth

    \n\n

    Introduction

    \n\n

    There are three OAuth procedures:

    \n\n\n\n

    See the Apps & Authentication Guide for an explanation of the different types of procedures.

    \n\n

    OAuth implicit code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. An authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system.

    \n\n

    Create a <a href=\"\">login</a>:

    \n\n
    GET https://id.twitch.tv/oauth2/authorize\n    ?client_id=<your client ID>\n    &redirect_uri=<your registered redirect URI>\n    &response_type=<type>\n    &scope=<space-separated list of scopes>\n
    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringSpecifies what information to return. This must be token, to return an access token. The user may be prompted to confirm authorization once or repeatedly; this is controlled by the optional force_verify parameter, below.
    scopestringSpace-separated list of scopes.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    force_verifybooleanSpecifies whether the user should be re-prompted for authorization. If this is true, the user always is prompted to confirm authorization. This is useful to allow your users to switch Twitch accounts, since there is no way to log users out of the API. Default: false (a given user sees the authorization page for a given set of scopes only the first time through the sequence).
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to a user’s viewing activity (by specifying the viewing_activity_read scope) and send the user to http://localhost:

    \n\n
    GET 'https://id.twitch.tv/oauth2/authorize?response_type=token&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read&state=c3ab8aa609ea11e793ae92361f002671'\n
    \n\n

    2) If the user authorizes your application, the user is redirected to your redirect URL:

    \n\n
    https://<your registered redirect URI>#access_token=<an access token>\n
    \n\n

    The access token is in the URL fragment, not the query string, so it will not show up in HTTP requests to your server. URI fragments can be accessed from JavaScript with document.location.hash.

    \n\n

    The response includes the state parameter, if it was in your request.

    \n\n

    In our example, your user gets redirected to:

    \n\n
    https://localhost#access_token=0123456789abcdefghijABCDEFGHIJ\n    &scope=viewing_activity_read\n    &state=c3ab8aa609ea11e793ae92361f002671\n    &token_type=bearer\n
    \n\n

    OAuth authorization code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. Then, an authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system. Use this request:

    \n\n
    GET https://id.twitch.tv/oauth2/authorize\n    ?client_id=<your client ID>\n    &redirect_uri=<your registered redirect URI>\n    &response_type=code\n    &scope=<space-separated list of scopes>\n
    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringThis must be code, causing an authorization code to be returned, which is used later in this procedure. A given user is prompted to confirm authorization only on the first request.
    scopestringSpace-separated list of scopes.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    force_verifybooleanSpecifies whether the user should be re-prompted for authorization. If this is true, the user always is prompted to confirm authorization. This is useful to allow your users to switch Twitch accounts, since there is no way to log users out of the API. Default: false (a given user sees the authorization page for a given set of scopes only the first time through the sequence).
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to a user’s viewing activity (by specifying the viewing_activity_read scope) and send the user to http://localhost:

    \n\n
    GET 'https://id.twitch.tv/oauth2/authorize?response_type=code&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read&state=c3ab8aa609ea11e793ae92361f002671'\n
    \n\n

    2) If the user authorizes your application, the user is redirected to your redirect URI, with an authorization code:

    \n\n
    https://<your registered redirect URI>/?code=<authorization code>\n
    \n\n

    The OAuth 2.0 authorization code is a 30-character, randomly generated string. It is used in the next step, a request made to the token endpoint in exchange for an access token.

    \n\n

    The response includes the state parameter, if it was in your request.

    \n\n

    In our example, your user gets redirected to:

    \n\n
    http://localhost/?code=394a8bc98028f39660e53025de824134fb46313\n    &scope=viewing_activity_read\n    &state=c3ab8aa609ea11e793ae92361f002671\n
    \n\n

    3) On your server, get an access token by making this request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    ?client_id=<your client ID>\n    &client_secret=<your client secret>\n    &code=<authorization code received above>\n    &grant_type=authorization_code\n    &redirect_uri=<your registered redirect URI>\n
    \n\n

    Here is a sample request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    ?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2\n    &client_secret=nyo51xcdrerl8z9m56w9w6wg\n    &code=394a8bc98028f39660e53025de824134fb46313\n    &grant_type=authorization_code\n    &redirect_uri=http://localhost\n
    \n\n

    4) We respond with a JSON-encoded access token. The response looks like this:

    \n\n
    {\n  \"access_token\": \"<user access token>\",\n  \"refresh_token\": \"<refresh token>\",\n  \"expires_in\": <number of seconds until the token expires>,\n  \"scope\": [\"<your previously listed scope(s)>\"],\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    In our example:

    \n\n
    {\n  \"access_token\": \"0123456789abcdefghijABCDEFGHIJ\",\n  \"refresh_token\": \"eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\",\n  \"expires_in\": 3600,\n  \"scope\": [\"viewing_activity_read\"],\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    OAuth client credentials flow

    \n\n

    As mentioned earlier, app access tokens are only for server-to-server API requests. The grant request below requires the client secret to acquire an app access token; this also should be done only as a server-to-server request, never in client code.

    \n\n

    1) On your server, get an app access token by making this request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    ?client_id=<your client ID>\n    &client_secret=<your client secret>\n    &grant_type=client_credentials\n    &scope=<space-separated list of scopes>\n
    \n\n

    Here is a sample request:

    \n\n
    POST https://id.twitch.tv/oauth2/token?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&client_secret=nyo51xcdrerl8z9m56w9w6wg&grant_type=client_credentials\n
    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    client_secretstringYour client secret.
    grant_typestringMust be client_credentials.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    scopestringSpace-separated list of scopes.
    \n\n

    2) We respond with a JSON-encoded app access token. The response looks like this:

    \n\n
    {\n  \"access_token\": \"<user access token>\",\n  \"refresh_token\": \"\",\n  \"expires_in\": <number of seconds until the token expires>,\n  \"scope\": [\"<your previously listed scope(s)>\"],\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    In our example:

    \n\n
    {\n  \"access_token\": \"prau3ol6mg5glgek8m89ec2s9q5i3i\",\n  \"refresh_token\": \"\",\n  \"expires_in\": 3600,\n  \"scope\": [],\n  \"token_type\": \"bearer\"\n}\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    OIDC implicit code flow
    \n\t\t\n\t\t\t
    OIDC authorization code flow
    \n\t\t\n\t\t\t
    Claims
    \n\t\t\n\t\t\t
    UserInfo endpoint
    \n\t\t\n\t\n\n\n\t\t

    Getting Tokens: OIDC

    \n\n

    Introduction

    \n\n

    There are two OIDC procedures:

    \n\n
      \n
    • The OIDC implicit code flow gets ID tokens and optional user access tokens.
    • \n
    • The OIDC authorization code flow gets ID tokens and user access tokens.
    • \n
    \n\n

    See the Apps & Authentication Guide for an explanation of the different types of procedures.

    \n\n

    OIDC implicit code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. Then, an authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system. Use this request:

    \n\n

    GET https://id.twitch.tv/oauth2/authorize ?client_id=<your client ID> &redirect_uri=<your registered redirect URI> &response_type=<type> &scope=<space-separated list of scopes> &claims=<JSON object specifying requested claims>

    \n\n

    There are several required and optional query-string parameters:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringThere are two valid values: token id_token – Return an access token and an ID token (JWT). A given user is prompted to confirm authorization only on the first request. This should be URL encoded as token+id_token or token%20id_token. id_token – Return only an ID token. For example, a client with a valid access token, who only needs added information about the user authorizing it, might specify this option.
    scopestring

    Space-separated list of scopes. This must include the openid scope.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Optional ParameterTypeDescription
    claimsstring

    JSON object encoded as a string specifying the claims to be returned in the ID token and/or the UserInfo endpoint response.

    noncestringOIDC opaque value to avoid CSRF attacks. (Specifically, this is used to associate the client’s authorization session with an ID token, to avoid replay attacks.) This value is echoed back in the response. We strongly recommend you use this.\n
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to the user’s viewing activity (by specifying the viewing_activity_read scope) and email verification state, and send the user to http://localhost:

    \n\n

    GET 'https://id.twitch.tv/oauth2/authorize?response_type=token+id_token&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read+openid&state=c3ab8aa609ea11e793ae92361f002671&claims={\"id_token\":{\"email_verified\":null}}'

    \n\n

    2) If the user authorizes your application, the user is sent to your redirect URI, with an ID token and optionally an access token (if that was requested):

    \n\n

    https://<your registered redirect URI>#id_token=<an id token>&access_token=<an access token>

    \n\n

    The payload of the JWT that is returned includes several default claims about the OIDC ID token, plus any additional claims you requested:

    \n\n
      \n
    • \niss – Token issuer (Twitch)
    • \n
    • \nsub – Subject or end-user identifier
    • \n
    • \naud – Audience or OAuth 2.0 client that is the intended recipient of the token
    • \n
    • \nexp – Expiration time (note that when the JWT ID tokens expire, they cannot be refreshed)
    • \n
    • \niat – Issuance time
    • \n
    • \nnonce – Value optionally specified in the request
    • \n
    \n\n

    In our example, the ID token will have an additional claim, email_verified, because that was in the request.

    \n\n

    The ID and access tokens are in the URL fragment, not the query string, so they will not show up in HTTP requests to your server. URI fragments can be accessed from JavaScript with document.location.hash.

    \n\n

    The response includes the state parameter in the URL fragment and/or the nonce parameter in the ID token’s payload, if they were provided on your initial request.

    \n\n

    Here is a sample response with both an ID token and access token:

    \n\n

    https://localhost#access_token=0123456789abcdefghijABCDEFGHIJ &token_type=bearer &id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjRvaXU4In0.eyJzdWIiOiJuZnlmZSIsImF1ZCI6ImltX29pY19jbGllbnQiLCJqdGkiOiJUOU4xUklkRkVzUE45enU3ZWw2eng2IiwiaXNzIjoiaHR0cHM6XC9cL3Nzby5tZXljbG91ZC5uZXQ6OTAzMSIsImlhdCI6MTM5MzczNzA3MSwiZXhwIjoxMzkzNzM3MzcxLCJub25jZSI6ImNiYTU2NjY2LTRiMTItNDU2YS04NDA3LTNkMzAyM2ZhMTAwMiIsImF0X2hhc2giOiJrdHFvZVBhc2praVY5b2Z0X3o5NnJBIn0.g1Jc9DohWFfFG3ppWfvW16ib6YBaONC5VMs8J61i5j5QLieY-mBEeVi1D3vr5IFWCfivY4hZcHtoJHgZk1qCumkAMDymsLGX-IGA7yFU8LOjUdR4IlCPlZxZ_vhqr_0gQ9pCFKDkiOv1LVv5x3YgAdhHhpZhxK6rWxojg2RddzvZ9Xi5u2V1UZ0jukwyG2d4PRzDn7WoRNDGwYOEt4qY7lv_NO2TY2eAklP-xYBWu0b9FBElapnstqbZgAXdndNs-Wqp4gyQG5D0owLzxPErR9MnpQfgNcai-PlWI_UrvoopKNbX0ai2zfkuQ-qh6Xn8zgkiaYDHzq4gzwRfwazaqA &state=c3ab8aa609ea11e793ae92361f002671 &scope=viewing_activity_read

    \n\n

    3) Validate the ID token. This is an important security measure to ensure the authenticity of the token and guard against any tampering.

    \n\n

    To verify the signature of our ID tokens, we host a public JSON Web Key (JWK) here. For details on how to use our JWK in validating ID tokens, see How to validate an OpenID Connect ID token.

    \n\n

    OIDC authorization code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. Then, an authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system. Use this request:

    \n\n

    GET https://id.twitch.tv/oauth2/authorize ?client_id=<your client ID> &redirect_uri=<your registered redirect URI> &response_type=code &scope=<space-separated list of scopes> &claims=<JSON object specifying requested claims>

    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringThis must be code, causing an authorization code to be returned, which is used later in this procedure. A given user is prompted to confirm authorization only on the first request.
    scopestringSpace-separated list of scopes. This must include the openid scope.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    claimsstringJSON object encoded as a string specifying the claims to be returned in the ID token and/or the UserInfo endpoint response.
    noncestringOIDC opaque value to avoid CSRF attacks. (Specifically, this is used to associate the client’s authorization session with an ID token, to avoid replay attacks.) This value is echoed back within the ID token. We strongly recommend you use this.\n
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to the user’s viewing activity (by specifying the viewing_activity_read scope) and email verification state, and send the user to http://localhost:

    \n\n

    bash GET 'https://id.twitch.tv/oauth2/authorize?response_type=code&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read+openid&state=c3ab8aa609ea11e793ae92361f002671&claims={\"id_token\":{\"email_verified\":null}}'

    \n\n

    2) If the user authorizes your application, the user is redirected to your redirect URI, with an authorization code:

    \n\n

    https://<your registered redirect URI>/?code=<authorization code>

    \n\n

    The OAuth 2.0 authorization code is a 30-character, randomly generated string. It is used in the next step, a request made to the token endpoint in exchange for access and ID tokens.

    \n\n

    The response includes the state parameter in the query string and/or the nonce parameter in the ID token’s payload, if they were provided on your initial request.

    \n\n

    In our example, your user gets redirected to:

    \n\n

    http://localhost/?code=394a8bc98028f39660e53025de824134fb46313 &scope=viewing_activity_read &state=c3ab8aa609ea11e793ae92361f002671

    \n\n

    3) On your server, get an access token and ID token by making this request:

    \n\n

    json POST https://id.twitch.tv/oauth2/token ?client_id=<your client ID> &client_secret=<your client secret> &code=<authorization code received above> &grant_type=authorization_code &redirect_uri=<your registered redirect URI>

    \n\n

    Here is a sample request:

    \n\n

    POST https://id.twitch.tv/oauth2/token ?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2 &client_secret=nyo51xcdrerl8z9m56w9w6wg &grant_type=authorization_code &redirect_uri=http://localhost &code=394a8bc98028f39660e53025de824134fb46313

    \n\n

    4) We respond with a JSON-encoded access token and an ID token. The payload of the JWT that is returned includes several default claims about the OIDC ID token, plus any additional claims you requested:

    \n\n
      \n
    • \niss – Token issuer (Twitch)
    • \n
    • \nsub – Subject or end-user identifier
    • \n
    • \naud – Audience or OAuth 2.0 client that is the intended recipient of the token
    • \n
    • \nexp – Expiration time (note that when the JWT ID tokens expire, they cannot be refreshed)
    • \n
    • \niat – Issuance time
    • \n
    • \nnonce – Value optionally specified in the request
    • \n
    \n\n

    In our example, the ID token will have additional claim, email_verified, because that was in the request.

    \n\n

    Here is a sample response:

    \n\n

    json { \"access_token\": \"0123456789abcdefghijABCDEFGHIJ\", \"refresh_token\": \"eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\", \"expires_in\": 3600, \"scope\": [\"viewing_activity_read\"], \"id_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxNDk0MzkxNDQiLCJ1cGRhdGVkX2F0IjoiMDAwMS0wMS0wMVQwMDowMDowMFoiLCJpc3MiOiJodHRwczovL3Bhc3Nwb3J0LnR3aXRjaC50diIsImF1ZCI6IjJrOGl6MnE0eG1scDM2MmQyaWR5YzBoNnA0MmQxZSIsImV4cCI6IjIwMTctMDUtMDVUMjI6MzI6MjcuNzk1MzQxNjI1WiIsImlhdCI6MTQ5NDAyMjY0N30=.6HkHCuwUufojZn3ogeyl8Bi0J8IyVjIzrTLLR-v-MpmP2-EYExjVT_aPjoIfuOmfK2cCDCsGSRL-p7rtFamuv3e4v--S_TkhekLioAdL-9Nm-ZnX8kdys9XYLEf8acFkQOmQ2W5DLfm68u3zAmpRMXsq_LPcsWVbPe5AGZK4Tt5mS5JIK1S8VCPTQLc7__rMI_3Hzpij09fILlbaicAKPqybLnqfMowyemcWmrecseNc_Jig_ZpGm7RqNkbxctBIBDouB_rGtH1R1CwlDs_PE5pSq4I67G6aoL0P4aUIOpFCXxLU45975ZdQDRRq3o2Lqce6cmRLOemO5JSCyTGZhQ==\", \"token_type\": \"bearer\" }

    \n\n

    5) Validate the ID token. This is an important security measure to ensure the authenticity of the token and guard against any tampering.

    \n\n

    To verify the signature of our ID tokens, we host a public JSON Web Key (JWK) here. For details on how to use our JWK in validating ID tokens, see How to validate an OpenID Connect ID token.

    \n\n

    Claims

    \n\n

    Each claim describes a piece of data you want to get about the user authorizing your application. In the claims parameter of your OIDC request, you can choose to include any, all, or none of the claims. If you choose to omit any specific claims, we include several claims by default.

    \n\n

    Claims are requested by passing a claims parameter in the authorization request. These requested claims can be retrieved in the ID token itself or through the UserInfo endpoint. How data is returned for each claim varies, depending on the format of the claims parameter in the request.

    \n\n

    The claims parameter is a JSON object with two fields: id_token and userinfo. You may specify claims in both fields, and there is no requirement on presence or uniqueness of the claims in either field. For example, to include a user’s email and email verification state in the ID token and a profile image through the UserInfo endpoint, the claims parameter would be:

    \n\n

    { \"id_token\": { \"email\": null, \"email_verified\": null }, \"userinfo\": { \"picture\": null } }

    \n\n

    In the request, the claims parameter would be:

    \n\n

    claims={\"id_token\":{\"email\":null,\"email_verified\":null},\"userinfo\":{\"picture\":null}}

    \n\n

    The email and email_verified claims will be included in the ID token that is returned. The picture claim will be returned when you call the UserInfo endpoint with the OAuth token returned in the authorization request (assuming you requested an OAuth token in the flow with either the implicit or authorization code flow).

    \n\n

    You can request the following claims:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ClaimData
    emailEmail address of the authorizing user.

    email_verified

    Email verification state of the authorizing user.
    pictureProfile image URL of the authorizing user.
    preferred_usernameDisplay name of the authorizing user.
    updated_atDate of the last update to the authorizing user’s profile.
    \n\n

    Note: The email and email_verified claims will soon be gated by the user:read:email scope that must be included on the authorization request.

    \n\n

    The following claims are included by default in both the ID token and the UserInfo endpoint:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Default ClaimData

    aud

    Audience: client ID of the application requesting a user’s authorization.

    azpAuthorized party: client ID of the application which is being authorized. Currently the same as aud.
    expExpiration time of the token. This is in UNIX/Epoch format.
    iatTime when the token was issued. This is in UNIX/Epoch format.
    issIssuer of the token.
    subUser ID of the authorizing user.
    \n\n

    UserInfo endpoint

    \n\n

    The UserInfo endpoint allows you to fetch claims originally provided in the authorization request outside of the ID token. Note that this endpoint is available only if you receive an OAuth token on behalf of the authorizing user. If your authorization request specifies only the id_token response type, you will not have an OAuth token to call this endpoint.

    \n\n

    GET 'https://id.twitch.tv/oauth2/userinfo' -H \"Authorization: Bearer <OAuth token>\"

    \n\n

    The response is the requested claims (along with the default claims), in JSON form:

    \n\n

    { \"aud\": \"<your client ID>\", \"exp\": 1542051527, \"iat\": 1542050627, \"iss\": \"https://id.twitch.tv/oauth2\", \"sub\": \"<authorizing user ID>\", \"azp\": \"<your client ID>\", \"picture\": \"<authorizing user profile image>\" }

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n"]}],"articles":["authentication","getting-tokens-oauth","getting-tokens-oidc"]}],"articles":["index","authentication","getting-tokens-oauth","getting-tokens-oidc"]}},"navigation":{"navigation_items":[{"label":"Products","link_url":"/products/","open_in_new_tab":false,"navigation_children":[{"label":"Extensions","link_url":"/products/extensions/","open_in_new_tab":false},{"label":"E2","link_url":"/products/enhanced-experiences/","open_in_new_tab":false},{"label":"Drops","link_url":"/products/drops/","open_in_new_tab":false},{"label":"Twitch API","link_url":"/products/api/","open_in_new_tab":false},{"label":"Analytics","link_url":"/products/analytics/","open_in_new_tab":false}]},{"label":"Case Studies","link_url":"/case-studies/","open_in_new_tab":false,"navigation_children":[{"label":"Code Samples","link_url":"/TODO/","open_in_new_tab":false},{"label":"Guides","link_url":"/TODO/","open_in_new_tab":false}]},{"label":"Support","link_url":"/support/","open_in_new_tab":false,"navigation_children":[{"label":"Developer Forum","link_url":"/TODO/","open_in_new_tab":false},{"label":"Twitch Dev Chat","link_url":"/TODO/","open_in_new_tab":false},{"label":"@TwitchDev","link_url":"/TODO/","open_in_new_tab":false}]},{"label":"Blog","link_url":"https://blog.twitch.tv","open_in_new_tab":false,"navigation_children":null},{"label":"Docs","link_url":"/docs/","open_in_new_tab":false,"navigation_children":[{"label":"API References","link_url":"/TODO/","open_in_new_tab":false},{"label":"And","link_url":"/TODO/","open_in_new_tab":false},{"label":"Other","link_url":"/TODO/","open_in_new_tab":false},{"label":"Such","link_url":"/TODO/","open_in_new_tab":false},{"label":"Items","link_url":"/TODO/","open_in_new_tab":false}]}]},"redirects":{"redirects":[{"redirect_from":"/support/","redirect_to":"/resources/"}]},"helix":{"consumes":["application/json"],"produces":["application/json"],"schemes":["https"],"swagger":"2.0","info":{"description":"Reference documentation for Twitch's Third Party API.\n\nFor information about the Authorization and Client-Id headers that each request must include, see the [Authorization](https://dev.twitch.tv/docs/authentication) and [Getting Started](https://dev.twitch.tv/docs/api) topics.\n\nFor information about the headers that Twitch returns with each response, see [Rate Limits](https://dev.twitch.tv/docs/api/guide#rate-limits).","title":"Twitch API Reference.","version":"1.0.0"},"host":"api.twitch.tv","basePath":"/","paths":{"/helix/analytics/extensions":{"get":{"security":[{"User OAuth Token":["analytics:read:extensions"]}],"description":"Gets an analytics report for one or more extensions. The response contains the URLs used to download the reports (CSV files). [Learn more](https://dev.twitch.tv/docs/insights).\n\nRequires a User access token with scope set to **analytics:read:extensions**.","produces":["application/json"],"tags":["Extensions"],"summary":"Gets an analytics report for one or more extensions.","operationId":"GetHelixExtensionAnalytics","parameters":[{"type":"string","description":"The extension's client ID. If specified, the response contains a report for the specified extension. If not specified, the response includes a report for each of the authenticated user’s extensions.","name":"extension_id","in":"query"},{"type":"string","description":"The type of analytics report to get. Possible values are: ","name":"type","in":"query"},{"type":"string","format":"date-time","description":"The start date of the reporting window in RFC3339 format. Set the time portion to zeroes (for example, YYYY-MM-DDT00:00:00Z). \nThe start date must be on or after January 31, 2018. If you specify an earlier date, the API ingores it and uses January 31, 2018. If you specify a start date, you must specify an end date. If you don't specify a start and end date, the report includes the most recent data.\nThe report contains one row of data for each day in the reporting window.","name":"started_at","in":"query"},{"type":"string","format":"date-time","description":"The end date of the reporting window in RFC3339 format. Set the time portion to zeroes (for example, YYYY-MM-DDT00:00:00Z). The report is inclusive of the end date.\nSpecify an end date only if you provide a start date. Because it can take up to two days for the data to be available, you must specify an end date that's earlier than today minus one to two days. If not, the API ignores your end date and uses an end date that is today minus one to two days.","name":"ended_at","in":"query"},{"type":"integer","format":"int64","description":"The maximum number of report URLs to return per page in the response. The minimum page size is 1 URL per page and the maximum is 100 URLs per page. The default is 20.\nNOTE: While you may specify a maximum value of 100, the response will contain at most 20 URLs per page.","name":"first","in":"query"},{"type":"string","description":"The cursor used to get the previous page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).\nTwitch ignores this field if `extension_id` is set.","name":"before","in":"query"},{"type":"string","description":"The cursor used to get the next page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).\nTwitch ignores this field if `extension_id` is set.","name":"after","in":"query"}],"responses":{"200":{"$ref":"#/responses/GetHelixExtensionAnalyticsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}}},"/helix/analytics/games":{"get":{"security":[{"User OAuth Token":["analytics:read:games"]}],"description":"Gets an analytics report for one or more games. The response contains the URLs used to download the reports (CSV files). [Learn more](https://dev.twitch.tv/docs/insights).\n\nRequires a User access token with scope set to **analytics:read:games**.","produces":["application/json"],"tags":["Games"],"summary":"Gets an analytics report for one or more games.","operationId":"GetHelixGameAnalytics","parameters":[{"type":"string","description":"The game's client ID. If specified, the response contains a report for the specified game. If not specified, the response includes a report for each of the authenticated user’s games.","name":"game_id","in":"query"},{"type":"string","description":"The type of analytics report to get. Possible values are: ","name":"type","in":"query"},{"type":"string","format":"date-time","description":"The start date of the reporting window in RFC3339 format. Set the time portion to zeroes (for example, YYYY-MM-DDT00:00:00Z). \nThe start date must be on or after January 31, 2018. If you specify an earlier date, the API ingores it and uses January 31, 2018. If you specify a start date, you must specify an end date. If you don't specify a start and end date, the report includes the most recent data.\nThe report contains one row of data for each day in the reporting window.","name":"started_at","in":"query"},{"type":"string","format":"date-time","description":"The end date of the reporting window in RFC3339 format. Set the time portion to zeroes (for example, YYYY-MM-DDT00:00:00Z). The report is inclusive of the end date.\nSpecify an end date only if you provide a start date. Because it can take up to two days for the data to be available, you must specify an end date that's earlier than today minus one to two days. If not, the API ignores your end date and uses an end date that is today minus one to two days.","name":"ended_at","in":"query"},{"type":"integer","format":"int64","description":"The maximum number of report URLs to return per page in the response. The minimum page size is 1 URL per page and the maximum is 100 URLs per page. The default is 20.\nNOTE: While you may specify a maximum value of 100, the response will contain at most 20 URLs per page.","name":"first","in":"query"},{"type":"string","description":"The cursor used to get the previous page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).\nTwitch ignores this field if `extension_id` is set.","name":"before","in":"query"},{"type":"string","description":"The cursor used to get the next page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).\nTwitch ignores this field if `extension_id` is set.","name":"after","in":"query"}],"responses":{"200":{"$ref":"#/responses/GetHelixGameAnalyticsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}}},"/helix/channels/commercial":{"post":{"security":[{"User OAuth Token":["channel:edit:commercial"]}],"description":"Starts a commercial on the specified channel. The channel must be live to start a commercial.\n\nRequires a User access token with scope set to **channel:edit:commercial**.","produces":["application/json"],"tags":["Ads"],"summary":"Starts a commercial","operationId":"PostHelixCommercial","parameters":[{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["broadcaster_id","length"],"properties":{"broadcaster_id":{"description":"The ID of the broadcaster that's running the commercial. This ID must match the user ID associated with the user OAuth token.","type":"string"},"length":{"description":"The length of the commercial to run, in seconds. Valid values are:","type":"integer","format":"int64"}}}}],"responses":{"200":{"$ref":"#/responses/PostHelixAdsSuccess"},"400":{"description":"BadRequest"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}}},"/helix/chat/emotes":{"get":{"description":"Gets all emoticons that the specified Twitch channel created. Broadcasters create these custom emoticons for users who subscribe to or follow the channel, or cheer Bits in the channel’s chat window. For information about the custom emotes, see [subscriber emotes](https://help.twitch.tv/s/article/subscriber-emote-guide), [Bits tier emotes](https://help.twitch.tv/s/article/custom-bit-badges-guide?language=bg#slots), and [follower emotes](https://blog.twitch.tv/en/2021/06/04/kicking-off-10-years-with-our-biggest-emote-update-ever/). [Learn more](https://dev.twitch.tv/docs/irc/emotes).\n\nNOTE: With the exception of custom follower emotes, users may use custom emotes in any Twitch chat.\n\nRequires an App access token.","produces":["application/json"],"tags":["Emotes"],"summary":"Gets all emoticons that the specified Twitch channel created","operationId":"GetHelixChannelEmotes","parameters":[{"type":"string","description":"An ID that identifies the broadcaster whose emoticons you want to get.","name":"broadcaster_id","in":"query","required":true}],"responses":{"200":{"$ref":"#/responses/GetHelixChannelEmotesSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"method":"get","path":"/helix/chat/emotes"}},"/helix/chat/emotes/global":{"get":{"description":"Gets all [global emotes](https://www.twitch.tv/creatorcamp/en/learn-the-basics/emotes/). Global emotes are Twitch-created emoticons that users can use in any Twitch chat. [Learn more](https://dev.twitch.tv/docs/irc/emotes).\n\nRequires an App access token.","produces":["application/json"],"tags":["Emotes"],"summary":"Gets all global emoticons","operationId":"GetHelixGlobalEmotes","responses":{"200":{"$ref":"#/responses/GetHelixGlobalEmotesSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"method":"get","path":"/helix/chat/emotes/global"}},"/helix/chat/emotes/set":{"get":{"description":"Gets the emoticons found in one or more specified emote sets. An emote set groups emoticons that have a similar context. For example, Twitch places all the subscriber emotes that a broadcaster uploads for their channel in the same emote set. [Learn more](https://dev.twitch.tv/docs/irc/emotes).\n\nRequires an App access token.","produces":["application/json"],"tags":["Emotes"],"summary":"Gets emoticons for one or more specified emote sets","operationId":"GetHelixEmoteSets","parameters":[{"maxItems":25,"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"An ID that identifies the emote set to get. Include the parameter for each emote set you want to get. For example, `emote_set_id=1234&emote_set_id=5678`. You may specify a maximum of 25 IDs.","name":"emote_set_id","in":"query","required":true}],"responses":{"200":{"$ref":"#/responses/GetHelixEmoteSetsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"method":"get","path":"/helix/chat/emotes/set"}},"/helix/goals":{"get":{"security":[{"User OAuth Token":["channel:read:goals"]}],"description":"Gets a list of active goals that the specified broadcaster created. Use this to get the current progress of each goal. [Learn more](https://dev.twitch.tv/docs/api/goals).\n\nRequires a User access token with scope set to **channel:read:goals**.","produces":["application/json"],"tags":["Goals"],"summary":"Gets a broadcaster's creator goals","operationId":"GetHelixGoals","parameters":[{"type":"string","description":"The ID of the broadcaster that created the goals. This ID must match the user ID associated with the user OAuth token. In other words, only the broadcaster can see their goals.","name":"broadcaster_id","in":"query","required":true}],"responses":{"200":{"$ref":"#/responses/GetHelixGoalsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}}},"/helix/polls":{"get":{"security":[{"User OAuth Token":["channel:read:polls"]}],"description":"Gets a list of polls that the broadcaster created. You can get all polls or you can filter the list for specific polls. Information about a poll is available for 90 days after being created.\n\nRequires a User access token with scope set to **channel:read:polls**.","produces":["application/json"],"tags":["Polls"],"summary":"Gets a list of polls that the broadcaster created","operationId":"GetHelixPolls","parameters":[{"type":"string","description":"The ID of the broadcaster that's running the poll. This ID must match the user ID associated with the user OAuth token. In other words, only the broadcaster can see their polls.","name":"broadcaster_id","in":"query","required":true},{"maxItems":20,"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"A list of IDs that identify the polls to return. Specify this parameter only if you want to filter the list that the request returns.\n\nTo specify more than one ID, include this parameter for each poll you want to get. For example, id=1234&id=5678. You may specify a maximum of 20 IDs.","name":"id","in":"query"},{"type":"integer","format":"int64","description":"The maximum number of polls to return per page in the response. The minimum page size is 1 poll per page and the maximum is 20 polls per page. The default is 20.","name":"first","in":"query"},{"type":"string","description":"The cursor used to get the next page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).","name":"after","in":"query"}],"responses":{"200":{"$ref":"#/responses/GetHelixPollsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"method":"get","path":"/helix/polls"},"post":{"security":[{"User OAuth Token":["channel:manage:polls"]}],"description":"Creates a poll that viewers in the broadcaster's channel can vote on. The poll begins as soon as it's created. You may run only one poll at a time.\n\nRequires a User access token with scope set to **channel:manage:polls**.","produces":["application/json"],"tags":["Polls"],"summary":"Creates a poll that viewers can vote on","operationId":"PostHelixPolls","parameters":[{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["broadcaster_id","title","choices","duration"],"properties":{"bits_per_vote":{"description":"The number of Bits the viewer must spend to cast one vote. If `BitsVotingEnabled` is **true**, the minimum is 1 and the maximum is 10,000.","type":"integer","format":"int64"},"bits_voting_enabled":{"description":"A Boolean value that indicates whether viewers can cast additional votes using Bits. The default is **false**. For information about Bits, see [Bits Guide](https://help.twitch.tv/s/article/guide-to-cheering-with-bits).","type":"boolean"},"broadcaster_id":{"description":"The ID of the broadcaster that's running the poll. This ID must match the user ID associated with the user OAuth token.","type":"string"},"channel_points_per_vote":{"description":"The number of points the viewer must spend to cast one vote. If `ChannelPointsVotingEnabled` is **true**, the minimum is 1 and the maximum is 1,000,000.","type":"integer","format":"int64"},"channel_points_voting_enabled":{"description":"A Boolean value that indicates whether viewers can cast additional votes using Channel Points. The default is **false**. For information about Channel Points, see [Channel Points Guide](https://help.twitch.tv/s/article/channel-points-guide).","type":"boolean"},"choices":{"description":"A list of choices that viewers can choose from. The list must contain a minimum of two choices and up to a maximum of five choices. Each choice may contain a maximum of 25 characters.","type":"array","items":{"$ref":"#/definitions/InputChoice"}},"duration":{"description":"The length of time (in seconds) that the poll will run for. The minimum is 15 seconds and the maximum is 1800 seconds (30 minutes).","type":"integer","format":"int64"},"title":{"description":"The question that viewers will vote on. For example, \"What game should I play next?\". The question may contain a maximum of 60 characters.","type":"string"}}}}],"responses":{"200":{"$ref":"#/responses/PostHelixPollsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}},"patch":{"security":[{"User OAuth Token":["channel:manage:polls"]}],"description":"Ends an active poll. You have the option to end it or end it and archive it.\n\nRequires a User access token with scope set to **channel:manage:polls**.","produces":["application/json"],"tags":["Polls"],"summary":"Ends an active poll","operationId":"PatchHelixPoll","parameters":[{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["id","broadcaster_id","status"],"properties":{"broadcaster_id":{"description":"The ID of the broadcaster that's running the poll. This ID must match the user ID associated with the user OAuth token.","type":"string"},"id":{"description":"The ID of the poll to update.","type":"string"},"status":{"description":"The status to set the poll to. Valid values are:\n","type":"string","enum":["TERMINATED","ARCHIVED"]}}}}],"responses":{"200":{"$ref":"#/responses/PatchHelixPollsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}}},"/helix/predictions":{"get":{"security":[{"User OAuth Token":["channel:read:predictions"]}],"description":"Gets a list of predictions that the broadcaster created. Results are ordered by most recent, which means that the currently active or locked prediction is first.\n\nRequires a User access token with scope set to **channel:read:predictions**.","produces":["application/json"],"tags":["Predictions"],"summary":"Gets a list of predictions that the broadcaster created","operationId":"GetHelixPredictions","parameters":[{"type":"string","description":"The ID of the broadcaster that's running the prediction. This ID must match the user ID associated with the user OAuth token. In other words, only the broadcaster can see their predictions.","name":"broadcaster_id","in":"query","required":true},{"maxItems":25,"type":"array","items":{"type":"string"},"collectionFormat":"multi","description":"A list of IDs that identify the predictions to return. Specify this parameter only if you want to filter the list that the request returns.\n\nTo specify more than one ID, include this parameter for each prediction you want to get. For example, id=1234&id=5678. You may specify a maximum of 25 IDs.","name":"id","in":"query"},{"type":"integer","format":"int64","description":"The maximum number of predictions to return per page in the response. The minimum page size is 1 prediction per page and the maximum is 25 predictions per page. The default is 20.","name":"first","in":"query"},{"type":"string","description":"The cursor used to get the next page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).","name":"after","in":"query"}],"responses":{"200":{"$ref":"#/responses/GetHelixPredictionsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}},"post":{"security":[{"User OAuth Token":["channel:manage:predictions"]}],"description":"Creates a prediction. The broadcaster poses a question and viewers try to predict the outcome. The prediction runs as soon as it's created. You may run only one prediction at a time.\n\nRequires a User access token with scope set to **channel:manage:predictions**.","produces":["application/json"],"tags":["Predictions"],"summary":"Creates a prediction","operationId":"PostHelixPredictions","parameters":[{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["broadcaster_id","title","outcomes","prediction_window"],"properties":{"broadcaster_id":{"description":"The ID of the broadcaster that's running the prediction. This ID must match the user ID associated with the user OAuth token.","type":"string"},"outcomes":{"description":"The list of possible outcomes for the prediction. The list must contain two choices.","type":"array","items":{"$ref":"#/definitions/OutcomeParam"}},"prediction_window":{"description":"The length of time (in seconds) that the prediction will run for. The minimum is 30 second and the maximum is 1800 seconds (30 minutes).","type":"integer","format":"int64"},"title":{"description":"The question that the broadcaster is asking. For example, *Will I finish this entire pizza?*","type":"string"}}}}],"responses":{"200":{"$ref":"#/responses/PostHelixPredictionsSuccess"},"400":{"description":"BadRequest"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}},"method":"post","path":"/helix/predictions"},"patch":{"security":[{"User OAuth Token":["channel:manage:predictions"]}],"description":"Locks, resolves, or cancels a Channel Points Prediction.\n\nRequires a User access token with scope set to **channel:manage:predictions**.","produces":["application/json"],"tags":["Predictions"],"summary":"Ends a prediction","operationId":"PatchHelixPredictions","parameters":[{"name":"Body","in":"body","required":true,"schema":{"type":"object","required":["broadcaster_id","id","status"],"properties":{"broadcaster_id":{"description":"The ID of the broadcaster that's running the prediction. This ID must match the user ID associated with the user OAuth token.","type":"string"},"id":{"description":"The ID of the prediction to update.","type":"string"},"status":{"description":"The status to set the prediction to. Valid values are:\n\n\nThe broadcaster can update an active prediction to LOCKED, RESOLVED, or CANCELED; and update a locked prediction to RESOLVED or CANCELED.\n\nThe broadcaster has up to 24 hours after the prediction window closes to resolve the prediction. If not, Twitch sets the status to CANCELED and returns the points. ","type":"string","enum":["RESOLVED","CANCELED","LOCKED"]},"winning_outcome_id":{"description":"The ID of the winning outcome. You must set this parameter if you're setting `status` to RESOLVED.","type":"string"}}}}],"responses":{"200":{"$ref":"#/responses/PatchHelixPredictionsSuccess"},"401":{"description":"Unauthorized"},"500":{"description":"Internal Server Error"}}}}},"definitions":{"ChannelEmote":{"type":"object","properties":{"emote_set_id":{"description":"An ID that identifies the emote set that the emoticon belongs to.","type":"string"},"emote_type":{"description":"The type of emoticon. Possible values are:\n","type":"string","enum":["bitstier","follower","subscriptions"]},"format":{"description":"The formats that the emoticon is available in. For example, if the emoticon is available only as a static PNG, the array contains only static. But if it’s available as a static PNG and an animated GIF, the array contains static and animated. Possible formats are:\n","type":"array","items":{"type":"string"}},"id":{"description":"An ID that uniquely identifies the emoticon.","type":"string"},"images":{"$ref":"#/definitions/EmoteImages"},"name":{"description":"The name of the emoticon. This is the name that viewers type in the chat window to get the emoticon to appear.","type":"string"},"scale":{"description":"The sizes that the emoticon is available in. For example, if the emoticon is available in small and medium sizes, the array contains 1.0 and 2.0. Possible sizes are:\n","type":"array","items":{"type":"string"}},"theme_mode":{"description":"The background themes that the emoticon is available in. Possible themes are:\n","type":"array","items":{"type":"string"}},"tier":{"description":"The tier at which the subscriber emoticon is unlocked. This field contains the tier information only if `emote_type` is set to subscriptions; otherwise, it’s an empty string.","type":"string"}}},"Choice":{"type":"object","properties":{"bits_votes":{"description":"The number of votes cast using Bits.","type":"integer","format":"int64"},"channel_points_votes":{"description":"The number of votes cast using Channel Points.","type":"integer","format":"int64"},"id":{"description":"An ID that uniquely identifies this choice.","type":"string"},"title":{"description":"One of the choices the viewer may select. The choice may contain a maximum of 25 characters.","type":"string"},"votes":{"description":"The total number of votes cast for this choice.","type":"integer","format":"int64"}}},"Commercial":{"type":"object","properties":{"length":{"description":"The length of the commercial.","type":"integer","format":"int64"},"message":{"description":"A message that describes why the request failed. This field is empty if the request succeeded.","type":"string"},"retry_after":{"description":"The number of seconds you must wait before running another commercial.","type":"integer","format":"int64"}}},"DateRange":{"type":"object","properties":{"ended_at":{"description":"The end date of the reporting window.","type":"string","format":"date-time"},"started_at":{"description":"The start date of the reporting window.","type":"string","format":"date-time"}}},"Duration":{"description":"A Duration represents the elapsed time between two instants\nas an int64 nanosecond count. The representation limits the\nlargest representable duration to approximately 290 years.","type":"integer","format":"int64"},"EmoteImages":{"description":"Contains the image URLs for the emoticon. These image URLs always provide a static (i.e., non-animated) emoticon image with a light background. \nIt's preferred that you use the templated URL in the `template` field of the response object to fetch the image instead of using these URLs.","type":"object","properties":{"url_1x":{"description":"A URL to the small version (28px x 28px) of the emoticon.","type":"string"},"url_2x":{"description":"A URL to the medium version (56px x 56px) of the emoticon.","type":"string"},"url_4x":{"description":"A URL to the large version (112px x 112px) of the emoticon.","type":"string"}}},"EmoteSet":{"type":"object","properties":{"emote_set_id":{"description":"An ID that identifies the emote set that the emoticon belongs to.","type":"string"},"emote_type":{"description":"The type of emoticon. Possible values are:\n","type":"string","enum":["bitstier","follower","subscriptions"]},"format":{"description":"The formats that the emoticon is available in. For example, if the emoticon is available only as a static PNG, the array contains only static. But if it’s available as a static PNG and an animated GIF, the array contains static and animated. Possible formats are:\n","type":"array","items":{"type":"string"}},"id":{"description":"An ID that uniquely identifies the emoticon.","type":"string"},"images":{"$ref":"#/definitions/EmoteImages"},"name":{"description":"The name of the emoticon. This is the name that viewers type in the chat window to get the emoticon to appear.","type":"string"},"owner_id":{"description":"The ID that identifies the broadcaster who owns the emoticon.","type":"string"},"scale":{"description":"The sizes that the emoticon is available in. For example, if the emoticon is available in small and medium sizes, the array contains 1.0 and 2.0. Possible sizes are:\n","type":"array","items":{"type":"string"}},"theme_mode":{"description":"The background themes that the emoticon is available in. Possible themes are:\n","type":"array","items":{"type":"string"}}}},"ExtensionAnalyticsReport":{"type":"object","properties":{"URL":{"description":"The URL that you use to download the report. The URL is valid for 5 minutes.","type":"string"},"date_range":{"$ref":"#/definitions/DateRange"},"extension_id":{"description":"An ID that identifies the extension that the report was generated for.","type":"string"},"type":{"description":"The type of report.","type":"string"}}},"GameAnalyticsReport":{"type":"object","properties":{"URL":{"description":"The URL that you use to download the report. The URL is valid for 5 minutes.","type":"string"},"date_range":{"$ref":"#/definitions/DateRange"},"game_id":{"description":"An ID that identifies the game that the report was generated for.","type":"string"},"type":{"description":"The type of report.","type":"string"}}},"GameOutcome":{"type":"object","properties":{"detection_time_sec":{"$ref":"#/definitions/Duration"},"result":{"type":"string"}}},"GetChannelEmotesResponse":{"type":"object","properties":{"data":{"description":"The list of emoticons from the specified channel.","type":"array","items":{"$ref":"#/definitions/ChannelEmote"}},"template":{"description":"A templated URL, which you use to create a CDN (content delivery network) URL used to fetch the emoticon. Use the values from the `id`, `format`, `scale`, and `theme_mode` fields of the **ChannelEmote** object to replace the like-named placeholder strings in the templated URL. For information about what the template looks like and how to use it to fetch emoticons, see [Emote CDN URL format](https://dev.twitch.tv/docs/irc/emotes#cdn-template).","type":"string"}}},"GetEmoteSetsResponse":{"type":"object","properties":{"data":{"description":"The list of emotes found in the specified emote sets.","type":"array","items":{"$ref":"#/definitions/EmoteSet"}},"template":{"description":"A templated URL, which you use to create a CDN (content delivery network) URL used to fetch the emoticon. Use the values from the `id`, `format`, `scale`, and `theme_mode` fields of the **EmoteSet** object to replace the like-named placeholder strings in the templated URL. For information about what the template looks like and how to use it to fetch emoticons, see [Emote CDN URL format](https://dev.twitch.tv/docs/irc/emotes#cdn-template).","type":"string"}}},"GetExtensionAnalyticsResponse":{"type":"object","properties":{"data":{"description":"A list of reports. The array is empty if there are no reports.","type":"array","items":{"$ref":"#/definitions/ExtensionAnalyticsReport"}},"pagination":{"$ref":"#/definitions/Pagination"}}},"GetGameAnalyticsResponse":{"type":"object","properties":{"data":{"description":"A list of reports. The array is empty if there are no reports.","type":"array","items":{"$ref":"#/definitions/GameAnalyticsReport"}},"pagination":{"$ref":"#/definitions/Pagination"}}},"GetGlobalEmotesResponse":{"type":"object","properties":{"data":{"description":"The list of global emoticons.","type":"array","items":{"$ref":"#/definitions/GlobalEmote"}},"template":{"description":"A templated URL, which you use to create a CDN (content delivery network) URL used to fetch the emoticon. Use the values from the `id`, `format`, `scale`, and `theme_mode` fields of the **GlobalEmote** object to replace the like-named placeholder strings in the templated URL. For information about what the template looks like and how to use it to fetch emoticons, see [Emote CDN URL format](https://dev.twitch.tv/docs/irc/emotes#cdn-template).","type":"string"}}},"GetGoalsResponse":{"type":"object","properties":{"data":{"description":"An array of **Goal** objects. The array will contain at most one goal. The array is empty if the broadcaster hasn't created goals.\n\nNOTE: Although the API currently supports only one goal, you should write your application to support one or more goals.","type":"array","items":{"$ref":"#/definitions/Goal"}}}},"GetPollsResponse":{"type":"object","properties":{"data":{"description":"A list of of polls. The polls are returned in order of start time. The array is empty if the broadcaster hasn't created polls.","type":"array","items":{"$ref":"#/definitions/Poll"}},"pagination":{"$ref":"#/definitions/Pagination"}}},"GetPredictionsResponse":{"type":"object","properties":{"data":{"description":"An array of predictions. The array is empty if the broadcaster hasn't created predictions.","type":"array","items":{"$ref":"#/definitions/Prediction"}},"pagination":{"$ref":"#/definitions/Pagination"}}},"GlobalEmote":{"type":"object","properties":{"format":{"description":"The formats that the emoticon is available in. For example, if the emoticon is available only as a static PNG, the array contains only static. But if it’s available as a static PNG and an animated GIF, the array contains static and animated. Possible formats are:\n","type":"array","items":{"type":"string"}},"id":{"description":"An ID that uniquely identifies the emoticon.","type":"string"},"images":{"$ref":"#/definitions/EmoteImages"},"name":{"description":"The name of the emoticon. This is the name that viewers type in the chat window to get the emoticon to appear.","type":"string"},"scale":{"description":"The sizes that the emoticon is available in. For example, if the emoticon is available in small and medium sizes, the array contains 1.0 and 2.0. Possible sizes are:\n","type":"array","items":{"type":"string"}},"theme_mode":{"description":"The background themes that the emoticon is available in. Possible themes are:\n","type":"array","items":{"type":"string"}}}},"Goal":{"type":"object","properties":{"broadcaster_id":{"description":"An ID that uniquely identifies the broadcaster that created the goal.","type":"string"},"broadcaster_login":{"description":"The broadcaster's user handle.","type":"string"},"broadcaster_name":{"description":"The broadcaster's display name.","type":"string"},"created_at":{"description":"The UTC timestamp in [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) format, which indicates when the broadcaster created the goal.","type":"string"},"current_amount":{"description":"The current value.\n\nIf the goal is to increase followers, this field is set to the current number of followers. This number increases with new followers and decreases if users unfollow the channel.\n\nFor subscriptions, the amount is increased and decreased by the points value associated with the subscription tier. For example, if a tier-two subscription is worth 2 points, the amount is increased or decreased by 2, not 1.","type":"integer","format":"int64"},"description":{"description":"A description of the goal, if specified. The description may contain a maximum of 40 characters.","type":"string"},"id":{"description":"An ID that uniquely identifies this goal.","type":"string"},"target_amount":{"description":"The goal's target value. For example, if the broadcaster has 200 followers before creating the goal, and their goal is to double that number, this field is set to 400.","type":"integer","format":"int64"},"type":{"description":"The type of goal. Possible values are: ","type":"string"}}},"HearthstoneDeepmetadataEvent":{"type":"object","properties":{"game_mode":{"$ref":"#/definitions/HearthstoneHero"},"heroes":{"type":"array","items":{"$ref":"#/definitions/HearthstoneHero"}},"outcome":{"$ref":"#/definitions/GameOutcome"},"state":{"type":"string"},"state_start_time_sec":{"$ref":"#/definitions/Duration"}}},"HearthstoneHero":{"type":"object","properties":{"class":{"type":"string"},"detection_time_sec":{"$ref":"#/definitions/Duration"},"label":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"}}},"InputChoice":{"type":"object","properties":{"title":{"description":"One of the choices the viewer may select. The choice may contain a maximum of 25 characters.","type":"string"}}},"Outcome":{"type":"object","properties":{"channel_points":{"description":"The number of Channel Points spent by viewers on this outcome.","type":"integer","format":"int64"},"color":{"description":"The color that visually identifies this outcome in the UX. Valid values are:\n","type":"string","enum":["BLUE","PINK"]},"id":{"description":"An ID that uniquely identifies this outcome.","type":"string"},"title":{"description":"The text of one of the outcomes the viewer may select.","type":"string"},"top_predictors":{"description":"A list of viewers who were the top predictors; otherwise, **null** if none.","type":"array","minLength":0,"items":{"$ref":"#/definitions/User"}},"users":{"description":"The number of unique viewers that chose this outcome.","type":"integer","format":"int64"}}},"OutcomeParam":{"type":"object","properties":{"title":{"description":"The text of one of the outcomes the viewer may select.","type":"string"}}},"OverwatchDeepmetadataEvent":{"type":"object","properties":{"heroes":{"type":"array","items":{"$ref":"#/definitions/OverwatchPlayer"}},"outcome":{"$ref":"#/definitions/GameOutcome"},"state":{"type":"string"},"state_start_time_sec":{"$ref":"#/definitions/Duration"}}},"OverwatchPlayer":{"type":"object","properties":{"ability":{"type":"string"},"detection_time_sec":{"$ref":"#/definitions/Duration"},"label":{"type":"string"},"name":{"type":"string"},"role":{"type":"string"}}},"Pagination":{"type":"object","properties":{"cursor":{"description":"The cursor used to page results. Use to set the request's *after* or *before* query parameter depending on whether you're paging forwards or backwards.","type":"string"}}},"PatchPollsResponse":{"type":"object","properties":{"data":{"description":"An array that contains the single poll you updated.","type":"array","items":{"$ref":"#/definitions/Poll"}}}},"PatchPredictionsResponse":{"type":"object","properties":{"data":{"description":"An array that contains the single prediction you updated.","type":"array","items":{"$ref":"#/definitions/Prediction"}}}},"Poll":{"type":"object","properties":{"bits_per_vote":{"description":"The number of Bits the viewer must spend to cast one vote.","type":"integer","format":"int64"},"bits_voting_enabled":{"description":"A Boolean value that indicates whether viewers can cast additional votes using Bits. For information about Bits, see [Bits Guide](https://help.twitch.tv/s/article/guide-to-cheering-with-bits).","type":"boolean"},"broadcaster_id":{"description":"An ID that uniquely identifies the broadcaster that created the poll.","type":"string"},"broadcaster_login":{"description":"The broadcaster's user handle.","type":"string"},"broadcaster_name":{"description":"The broadcaster's display name.","type":"string"},"channel_points_per_vote":{"description":"The number of points the viewer must spend to cast one vote.","type":"integer","format":"int64"},"channel_points_voting_enabled":{"description":"A Boolean value that indicates whether viewers can cast additional votes using Channel Points. For information about Channel Points, see [Channel Points Guide](https://help.twitch.tv/s/article/channel-points-guide).","type":"boolean"},"choices":{"description":"A list of choices that viewers can choose from. The list will contain a minimum of two choices and up to a maximum of five choices.","type":"array","items":{"$ref":"#/definitions/Choice"}},"duration":{"description":"The length of time (in seconds) that the poll will run for.","type":"integer","format":"int64"},"ended_at":{"description":"The UTC timestamp of when the poll ended. If the status is ACTIVE, this is set to **null**.","type":"string","format":"date-time","minLength":0},"id":{"description":"An ID that uniquely identifies the poll.","type":"string"},"started_at":{"description":"The UTC timestamp of when the poll began.","type":"string","format":"date-time","minLength":0},"status":{"description":"The poll's status. Valid values are:\n","type":"string","enum":["ACTIVE","COMPLETED","TERMINATED","ARCHIVED","MODERATED","INVALID"]},"title":{"description":"The question that viewers will vote on. For example, *What game should I play next?* The title may contain a maximum of 60 characters.","type":"string"}}},"PostCommercialResponse":{"type":"object","properties":{"data":{"description":"An array that contains the single run-commercial request you created. ","type":"array","items":{"$ref":"#/definitions/Commercial"}}}},"PostPollsResponse":{"type":"object","properties":{"data":{"description":"An array that contains the single poll you created. The **Poll** object includes the poll's ID.","type":"array","items":{"$ref":"#/definitions/Poll"}}}},"PostPredictionsResponse":{"type":"object","properties":{"data":{"description":"An array that contains the single prediction you created. The **Prediction** object contains the prediction's ID.","type":"array","items":{"$ref":"#/definitions/Prediction"}}}},"Prediction":{"type":"object","properties":{"broadcaster_id":{"description":"An ID that uniquely identifies the broadcaster that created the prediction.","type":"string"},"broadcaster_login":{"description":"The broadcaster's user handle.","type":"string"},"broadcaster_name":{"description":"The broadcaster's display name.","type":"string"},"created_at":{"description":"The UTC timestamp of when the Prediction began.","type":"string","format":"date-time","minLength":0},"ended_at":{"description":"The UTC timestamp of when the Prediction ended. If the status is ACTIVE, this is set to **null**.","type":"string","format":"date-time","minLength":0},"id":{"description":"An ID that uniquely identifies this prediction.","type":"string"},"locked_at":{"description":"The UTC timestamp of when the Prediction was locked. If the status is not LOCKED, this is set to **null**.","type":"string","format":"date-time","minLength":0},"outcomes":{"description":"The list of possible outcomes for the prediction. The list will contain two choices.","type":"array","items":{"$ref":"#/definitions/Outcome"}},"prediction_window":{"description":"The length of time (in seconds) that the prediction will run for.","type":"integer","format":"int64"},"status":{"description":"The prediction's status. Valid values are:\n","type":"string","enum":["RESOLVED","ACTIVE","CANCELED","LOCKED"]},"title":{"description":"The question that the broadcaster is asking. For example, *Will I finish this entire pizza?*","type":"string"},"winning_outcome_id":{"description":"The ID of the winning outcome. If the status is ACTIVE, this is set to **null**.","type":"string","minLength":0}}},"StreamDeepMetadata":{"type":"object","properties":{"HEARTHSTONE":{"$ref":"#/definitions/HearthstoneDeepmetadataEvent"},"OVERWATCH":{"$ref":"#/definitions/OverwatchDeepmetadataEvent"},"content_type":{"type":"array","items":{"$ref":"#/definitions/StreamDeepMetadataItem"}},"video_time_sec":{"$ref":"#/definitions/Duration"}}},"StreamDeepMetadataItem":{"type":"object","properties":{"confidence":{"type":"number","format":"double"},"genre":{"type":"string"},"id":{"type":"string"}}},"User":{"type":"object","properties":{"channel_points_used":{"description":"The number of Channel Points the user spent.","type":"integer","format":"int64"},"channel_points_won":{"description":"The number of Channel Points distributed to the user.","type":"integer","format":"int64"},"user_id":{"description":"An ID that uniquely identifies the viewer.","type":"string"},"user_login":{"description":"The viewer's display name.","type":"string"},"user_name":{"description":"The viewer's user handle.","type":"string"}}},"VodDeepMetadata":{"type":"object","properties":{"deep_metadata":{"type":"array","items":{"$ref":"#/definitions/VodDeepMetadataItem"}},"video_id":{"type":"string"}}},"VodDeepMetadataItem":{"type":"object","properties":{"HEARTHSTONE":{"$ref":"#/definitions/HearthstoneDeepmetadataEvent"},"OVERWATCH":{"$ref":"#/definitions/OverwatchDeepmetadataEvent"},"content_type":{"$ref":"#/definitions/StreamDeepMetadataItem"},"end_time_sec":{"$ref":"#/definitions/Duration"},"start_time_sec":{"$ref":"#/definitions/Duration"}}}},"responses":{"GetHelixChannelEmotesSuccess":{"description":"Success response for Get Channel Emotes API","schema":{"$ref":"#/definitions/GetChannelEmotesResponse"}},"GetHelixEmoteSetsSuccess":{"description":"Success response for Get Emote Sets API","schema":{"$ref":"#/definitions/GetEmoteSetsResponse"}},"GetHelixExtensionAnalyticsSuccess":{"description":"Success response for Get Extension Analytics API","schema":{"$ref":"#/definitions/GetExtensionAnalyticsResponse"}},"GetHelixGameAnalyticsSuccess":{"description":"Success response for Get Game Analytics API","schema":{"$ref":"#/definitions/GetGameAnalyticsResponse"}},"GetHelixGlobalEmotesSuccess":{"description":"Success response for Get Global Emotes API","schema":{"$ref":"#/definitions/GetGlobalEmotesResponse"}},"GetHelixGoalsSuccess":{"description":"Success response for Get Goals API","schema":{"$ref":"#/definitions/GetGoalsResponse"}},"GetHelixPollsSuccess":{"description":"Success response for Get Polls API","schema":{"$ref":"#/definitions/GetPollsResponse"}},"GetHelixPredictionsSuccess":{"description":"Success response for Get Predictions API","schema":{"$ref":"#/definitions/GetPredictionsResponse"}},"PatchHelixPollsSuccess":{"description":"Success response for Patch Polls API","schema":{"$ref":"#/definitions/PatchPollsResponse"}},"PatchHelixPredictionsSuccess":{"description":"Success response for Patch Predictions API","schema":{"$ref":"#/definitions/PatchPredictionsResponse"}},"PostHelixAdsSuccess":{"description":"Success response for Post Commercial API","schema":{"$ref":"#/definitions/PostCommercialResponse"}},"PostHelixPollsSuccess":{"description":"Success response for Post Polls API","schema":{"$ref":"#/definitions/PostPollsResponse"}},"PostHelixPredictionsSuccess":{"description":"Success response for Post Predictions API","schema":{"$ref":"#/definitions/PostPredictionsResponse"}}},"securityDefinitions":{"App-Access OAuth Token":{"type":"oauth2","flow":"accessCode","authorizationUrl":"https://id.twitch.tv/oauth2/authorize","tokenUrl":"https://id.twitch.tv/oauth2/token"},"User OAuth Token":{"type":"oauth2","flow":"accessCode","authorizationUrl":"https://id.twitch.tv/oauth2/authorize","tokenUrl":"https://id.twitch.tv/oauth2/token","scopes":{"analytics:read:extensions":"Get an extension's analytics report","analytics:read:games":"Get an game's analytics report","channel:edit:commercial":"Start a commercial on a live channel","channel:manage:polls":"Manage a channel’s polls","channel:manage:predictions":"Manage a channel’s Channel Points Predictions","channel:read:goals":"Get a channel’s creator goals","channel:read:polls":"Get a channel’s polls","channel:read:predictions":"Get a channel’s Channel Points Predictions"}}},"security":[{"App-Access OAuth Token":[]},{"User OAuth Token":[]}]},"petstore":{"swagger":"2.0","info":{"description":"This is a sample server Petstore server. You can find out more about Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can use the api key `special-key` to test the authorization filters.","version":"1.0.5","title":"Swagger Petstore","termsOfService":"http://swagger.io/terms/","contact":{"email":"apiteam@swagger.io"},"license":{"name":"Apache 2.0","url":"http://www.apache.org/licenses/LICENSE-2.0.html"}},"host":"petstore.swagger.io","basePath":"/v2","tags":[{"name":"pet","description":"Everything about your Pets","externalDocs":{"description":"Find out more","url":"http://swagger.io"}},{"name":"store","description":"Access to Petstore orders"},{"name":"user","description":"Operations about user","externalDocs":{"description":"Find out more about our store","url":"http://swagger.io"}}],"schemes":["https","http"],"paths":{"/pet/{petId}/uploadImage":{"post":{"tags":["pet"],"summary":"Uploads an image","description":"","operationId":"uploadFile","consumes":["multipart/form-data"],"produces":["application/json"],"parameters":[{"name":"petId","in":"path","description":"ID of pet to update","required":true,"type":"integer","format":"int64"},{"name":"additionalMetadata","in":"formData","description":"Additional data to pass to server","required":false,"type":"string"},{"name":"file","in":"formData","description":"file to upload","required":false,"type":"file"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/ApiResponse"}}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet":{"post":{"tags":["pet"],"summary":"Add a new pet to the store","description":"","operationId":"addPet","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"Pet object that needs to be added to the store","required":true,"schema":{"$ref":"#/definitions/Pet"}}],"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"put":{"tags":["pet"],"summary":"Update an existing pet","description":"","operationId":"updatePet","consumes":["application/json","application/xml"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"Pet object that needs to be added to the store","required":true,"schema":{"$ref":"#/definitions/Pet"}}],"responses":{"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"},"405":{"description":"Validation exception"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/findByStatus":{"get":{"tags":["pet"],"summary":"Finds Pets by status","description":"Multiple status values can be provided with comma separated strings","operationId":"findPetsByStatus","produces":["application/json","application/xml"],"parameters":[{"name":"status","in":"query","description":"Status values that need to be considered for filter","required":true,"type":"array","items":{"type":"string","enum":["available","pending","sold"],"default":"available"},"collectionFormat":"multi"}],"responses":{"200":{"description":"successful operation","schema":{"type":"array","items":{"$ref":"#/definitions/Pet"}}},"400":{"description":"Invalid status value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/pet/findByTags":{"get":{"tags":["pet"],"summary":"Finds Pets by tags","description":"Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.","operationId":"findPetsByTags","produces":["application/json","application/xml"],"parameters":[{"name":"tags","in":"query","description":"Tags to filter by","required":true,"type":"array","items":{"type":"string"},"collectionFormat":"multi"}],"responses":{"200":{"description":"successful operation","schema":{"type":"array","items":{"$ref":"#/definitions/Pet"}}},"400":{"description":"Invalid tag value"}},"security":[{"petstore_auth":["write:pets","read:pets"]}],"deprecated":true}},"/pet/{petId}":{"get":{"tags":["pet"],"summary":"Find pet by ID","description":"Returns a single pet","operationId":"getPetById","produces":["application/json","application/xml"],"parameters":[{"name":"petId","in":"path","description":"ID of pet to return","required":true,"type":"integer","format":"int64"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/Pet"}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"}},"security":[{"api_key":[]}]},"post":{"tags":["pet"],"summary":"Updates a pet in the store with form data","description":"","operationId":"updatePetWithForm","consumes":["application/x-www-form-urlencoded"],"produces":["application/json","application/xml"],"parameters":[{"name":"petId","in":"path","description":"ID of pet that needs to be updated","required":true,"type":"integer","format":"int64"},{"name":"name","in":"formData","description":"Updated name of the pet","required":false,"type":"string"},{"name":"status","in":"formData","description":"Updated status of the pet","required":false,"type":"string"}],"responses":{"405":{"description":"Invalid input"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]},"delete":{"tags":["pet"],"summary":"Deletes a pet","description":"","operationId":"deletePet","produces":["application/json","application/xml"],"parameters":[{"name":"api_key","in":"header","required":false,"type":"string"},{"name":"petId","in":"path","description":"Pet id to delete","required":true,"type":"integer","format":"int64"}],"responses":{"400":{"description":"Invalid ID supplied"},"404":{"description":"Pet not found"}},"security":[{"petstore_auth":["write:pets","read:pets"]}]}},"/store/order":{"post":{"tags":["store"],"summary":"Place an order for a pet","description":"","operationId":"placeOrder","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"order placed for purchasing the pet","required":true,"schema":{"$ref":"#/definitions/Order"}}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/Order"}},"400":{"description":"Invalid Order"}}}},"/store/order/{orderId}":{"get":{"tags":["store"],"summary":"Find purchase order by ID","description":"For valid response try integer IDs with value >= 1 and <= 10. Other values will generated exceptions","operationId":"getOrderById","produces":["application/json","application/xml"],"parameters":[{"name":"orderId","in":"path","description":"ID of pet that needs to be fetched","required":true,"type":"integer","maximum":10,"minimum":1,"format":"int64"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/Order"}},"400":{"description":"Invalid ID supplied"},"404":{"description":"Order not found"}}},"delete":{"tags":["store"],"summary":"Delete purchase order by ID","description":"For valid response try integer IDs with positive integer value. Negative or non-integer values will generate API errors","operationId":"deleteOrder","produces":["application/json","application/xml"],"parameters":[{"name":"orderId","in":"path","description":"ID of the order that needs to be deleted","required":true,"type":"integer","minimum":1,"format":"int64"}],"responses":{"400":{"description":"Invalid ID supplied"},"404":{"description":"Order not found"}}}},"/store/inventory":{"get":{"tags":["store"],"summary":"Returns pet inventories by status","description":"Returns a map of status codes to quantities","operationId":"getInventory","produces":["application/json"],"parameters":[],"responses":{"200":{"description":"successful operation","schema":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}}}},"security":[{"api_key":[]}]}},"/user/createWithArray":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"","operationId":"createUsersWithArrayInput","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"List of user object","required":true,"schema":{"type":"array","items":{"$ref":"#/definitions/User"}}}],"responses":{"default":{"description":"successful operation"}}}},"/user/createWithList":{"post":{"tags":["user"],"summary":"Creates list of users with given input array","description":"","operationId":"createUsersWithListInput","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"List of user object","required":true,"schema":{"type":"array","items":{"$ref":"#/definitions/User"}}}],"responses":{"default":{"description":"successful operation"}}}},"/user/{username}":{"get":{"tags":["user"],"summary":"Get user by user name","description":"","operationId":"getUserByName","produces":["application/json","application/xml"],"parameters":[{"name":"username","in":"path","description":"The name that needs to be fetched. Use user1 for testing. ","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","schema":{"$ref":"#/definitions/User"}},"400":{"description":"Invalid username supplied"},"404":{"description":"User not found"}}},"put":{"tags":["user"],"summary":"Updated user","description":"This can only be done by the logged in user.","operationId":"updateUser","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"name":"username","in":"path","description":"name that need to be updated","required":true,"type":"string"},{"in":"body","name":"body","description":"Updated user object","required":true,"schema":{"$ref":"#/definitions/User"}}],"responses":{"400":{"description":"Invalid user supplied"},"404":{"description":"User not found"}}},"delete":{"tags":["user"],"summary":"Delete user","description":"This can only be done by the logged in user.","operationId":"deleteUser","produces":["application/json","application/xml"],"parameters":[{"name":"username","in":"path","description":"The name that needs to be deleted","required":true,"type":"string"}],"responses":{"400":{"description":"Invalid username supplied"},"404":{"description":"User not found"}}}},"/user/login":{"get":{"tags":["user"],"summary":"Logs user into the system","description":"","operationId":"loginUser","produces":["application/json","application/xml"],"parameters":[{"name":"username","in":"query","description":"The user name for login","required":true,"type":"string"},{"name":"password","in":"query","description":"The password for login in clear text","required":true,"type":"string"}],"responses":{"200":{"description":"successful operation","headers":{"X-Expires-After":{"type":"string","format":"date-time","description":"date in UTC when token expires"},"X-Rate-Limit":{"type":"integer","format":"int32","description":"calls per hour allowed by the user"}},"schema":{"type":"string"}},"400":{"description":"Invalid username/password supplied"}}}},"/user/logout":{"get":{"tags":["user"],"summary":"Logs out current logged in user session","description":"","operationId":"logoutUser","produces":["application/json","application/xml"],"parameters":[],"responses":{"default":{"description":"successful operation"}}}},"/user":{"post":{"tags":["user"],"summary":"Create user","description":"This can only be done by the logged in user.","operationId":"createUser","consumes":["application/json"],"produces":["application/json","application/xml"],"parameters":[{"in":"body","name":"body","description":"Created user object","required":true,"schema":{"$ref":"#/definitions/User"}}],"responses":{"default":{"description":"successful operation"}}}}},"securityDefinitions":{"api_key":{"type":"apiKey","name":"api_key","in":"header"},"petstore_auth":{"type":"oauth2","authorizationUrl":"https://petstore.swagger.io/oauth/authorize","flow":"implicit","scopes":{"read:pets":"read your pets","write:pets":"modify pets in your account"}}},"definitions":{"ApiResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"type":{"type":"string"},"message":{"type":"string"}}},"Category":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Category"}},"Pet":{"type":"object","required":["name","photoUrls"],"properties":{"id":{"type":"integer","format":"int64"},"category":{"$ref":"#/definitions/Category"},"name":{"type":"string","example":"doggie"},"photoUrls":{"type":"array","xml":{"wrapped":true},"items":{"type":"string","xml":{"name":"photoUrl"}}},"tags":{"type":"array","xml":{"wrapped":true},"items":{"xml":{"name":"tag"},"$ref":"#/definitions/Tag"}},"status":{"type":"string","description":"pet status in the store","enum":["available","pending","sold"]}},"xml":{"name":"Pet"}},"Tag":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}},"xml":{"name":"Tag"}},"Order":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"petId":{"type":"integer","format":"int64"},"quantity":{"type":"integer","format":"int32"},"shipDate":{"type":"string","format":"date-time"},"status":{"type":"string","description":"Order Status","enum":["placed","approved","delivered"]},"complete":{"type":"boolean"}},"xml":{"name":"Order"}},"User":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"username":{"type":"string"},"firstName":{"type":"string"},"lastName":{"type":"string"},"email":{"type":"string"},"password":{"type":"string"},"phone":{"type":"string"},"userStatus":{"type":"integer","format":"int32","description":"User Status"}},"xml":{"name":"User"}}},"externalDocs":{"description":"Find out more about Swagger","url":"http://swagger.io"}},"articles_by_key":{"api":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Step 1: Setup
    \n\t\t\n\t\t\t
    Step 2: Sample Code
    \n\t\t\n\t\t\t
    Step 3: Response
    \n\t\t\n\t\t\t
    What’s Next
    \n\t\t\n\t\n\n\n\t\t

    Get Started with the Twitch API

    \n\n

    Introduction

    \n\n

    The Twitch API provides tools for developing integrations with Twitch. Here, as a quick example to get you started, we make a basic request to get the top streams for a specific game, using the Search Channels endpoint.

    \n\n

    Step 1: Setup

    \n\n

    To make API calls, you need a client ID. To receive one, log into the Twitch developer console, select the Apps tab, and click Register Your Application. Enter an app name and your OAuth redirect URI (where your users are redirected after being authorized), and select an app category. Click Create, and the app is created and listed on the dashboard as one of your registered apps. Click Manage to see the client ID.

    \n\n

    For more information about authentication see the Authentication Guide.

    \n\n

    Step 2: Sample Code

    \n\n

    This request searches to see if A Seagull is live:

    \n\n\n\n
    \n
    \n\n
    \n
    curl --location --request\nGET 'https://api.twitch.tv/helix/search/channels?query=a_seagull' \\\n--header 'client-id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n--header 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx'\n
    \n\n
    \n\n

    This example uses a sample client ID. To try it out, copy and paste the example into your terminal, replacing the sample client ID with your client ID.

    \n\n

    Step 3: Response

    \n\n

    The response shows that the channel is live:

    \n\n
    {\n    \"data\": [\n        {\n            \"broadcaster_language\": \"en\",\n            \"display_name\": \"a_seagull\",\n            \"game_id\": \"506442\",\n            \"id\": \"19070311\",\n            \"is_live\": true,\n            \"tags_ids\": [\n                \"6ea6bca4-4712-4ab9-a906-e3336a9d8039\"\n            ],\n            \"thumbnail_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/a_seagull-profile_image-4d2d235688c7dc66-300x300.png\",\n            \"title\": \"a_seagull\",\n            \"started_at\": \"2020-03-18T17:56:00Z\"\n        }\n    ],\n    \"pagination\": {}\n}\n
    \n\n

    For descriptions of the response fields, see Search Channels.

    \n\n

    What’s Next

    \n\n

    For more information on the API (including webhooks), see:

    \n\n\n\n

    See the Apps & Authentication Guide for information about using Twitch Authentication, which enables your application to take actions on behalf of a Twitch account or access certain data about a user’s account. Twitch supports OAuth 2.0 and OIDC.

    \n\n

    Stop by our Developer Forums to join our community of Twitch developers.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","guide":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Syntax Notes
    \n\t\t\n\t\t\t
    Connecting to Twitch IRC
    \n\t\t\n\t\t\t
    Re-Connecting to Twitch IRC
    \n\t\t\n\t\t\t
    Known and Verified Bots
    \n\t\t\n\t\t\t
    Command & Message Limits
    \n\t\t\n\t\t\t
    Invalid IRC Commands
    \n\t\t\n\t\t\t
    Generic IRC Commands
    \n\t\t\n\t\t\t
    Scopes for IRC Commands
    \n\t\t\n\t\t\t
    Twitch IRC Capabilities
    \n\t\t\n\t\n\n\n\t\t

    Chatbots & IRC Guide

    \n\n

    Introduction

    \n\n

    Twitch offers an IRC interface to our chat functionality. This allows you to, for instance:

    \n\n
      \n
    • Develop one or more bots for your channel.
    • \n
    • Connect to a channel’s chat with an IRC client instead of using the Web interface. Some developers prefer IRC because it fits their existing workflow, for example when they already have several non-Twitch IRC channels. Other developers prefer IRC because it is lighter weight and can thus be used on machines that are less powerful than the web interface.
    • \n
    \n\n

    While our IRC server generally follows RFC1459, there are several cases where it behaves slightly differently than other IRC servers. As described in this document, there are many Twitch-specific IRC capabilities. The differences are necessary to accommodate:

    \n\n
      \n
    • The massive scale at which our chat servers operate.
    • \n
    • Complex Twitch-specific features that we provide to viewers, broadcasters, and developers.
    • \n
    \n\n

    Syntax Notes

    \n\n

    All references to <channel> and <user> are references to channel and user names not IDs. Always enter the channel name (<channel>) in lowercase. The examples in the following table use these syntax conventions:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Lines prefixed with:Are sent from:To:
    <clientserver
    >serverconnecting client
    \n\n

    Connecting to Twitch IRC

    \n\n

    To connect:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
     WebSocket ClientsIRC Clients
    SSLwss://irc-ws.chat.twitch.tv:443irc://irc.chat.twitch.tv:6697
    Otherwisews://irc-ws.chat.twitch.tv:80irc://irc.chat.twitch.tv:6667
    \n\n

    To authenticate, your password (pass) should be an OAuth token authorized through our API and should use both the chat:read scope (to read messages) and the chat:edit scope (to send messages).

    \n\n
      \n
    • The token must have the prefix oauth:. For example, if your token is abcd, send oauth:abcd.
    • \n
    • To quickly get a token for your account, use this Twitch Chat OAuth Password Generator.
    • \n
    \n\n

    Your nickname (nick) must be your Twitch username (login name) in lowercase.

    \n\n

    A successful connection session looks like the following example:

    \n\n
    < PASS oauth:<Twitch OAuth token>\n< NICK <user>\n> :tmi.twitch.tv 001 <user> :Welcome, GLHF!\n> :tmi.twitch.tv 002 <user> :Your host is tmi.twitch.tv\n> :tmi.twitch.tv 003 <user> :This server is rather new\n> :tmi.twitch.tv 004 <user> :-\n> :tmi.twitch.tv 375 <user> :-\n> :tmi.twitch.tv 372 <user> :You are in a maze of twisty passages.\n> :tmi.twitch.tv 376 <user> :>\n
    \n\n

    About once every five minutes, the server will send you a PING :tmi.twitch.tv. To ensure that your connection to the server is not prematurely terminated, reply with PONG :tmi.twitch.tv.

    \n\n

    If your connection fails for any reason, you will be disconnected from the server. Common reasons for failed connections are:

    \n\n
      \n
    • Connecting on the wrong port
    • \n
    • Connecting to the wrong server
    • \n
    • Using an incorrect user name or password
    • \n
    \n\n

    Re-Connecting to Twitch IRC

    \n\n

    To re-connect to Twitch, follow the same process. Best practice suggests trying again with exponential backoff (immediate, 1s, 2s, 4s, 8s).

    \n\n

    Known and Verified Bots

    \n\n

    There are two special statuses for bots which enhance the Twitch user experience and are trusted: known and verified. Both statuses provide elevated privileges. Verified bots have higher throughput than known bots. Verified status is granted only rarely.

    \n\n

    Both known and verified bots:

    \n\n
      \n
    • Have higher chat limits than regular users.
    • \n
    • Are not exempt from AutoMod mode. AutoMod analyzes chat messages flags potentially risky messages for a channel moderator, who can then allow or deny them to appear in chat.
    • \n
    • Are exempt from whispers being dropped for being spam. The spam classifier is still run against these whispers, they may be marked as spam, and their spam status is logged for auditing purposes.
    • \n
    \n\n

    To request known or verified bot status, please fill out the form at https://dev.twitch.tv/limit-increase as follows:

    \n\n
      \n
    • Select IRC Command and Message Rate as the service for which you want to request a limit.
    • \n
    • Instead of Client ID, enter your bot’s Twitch ID.
    • \n
    • Enter your bot request as the new limit.
    • \n
    \n\n

    After the form is reviewed, you will be emailed the results, typically within 3 business days.

    \n\n

    Command & Message Limits

    \n\n

    There are limits of the number of IRC commands or messages you are allowed to send to the server. If you exceed these limits, you are locked out of chat for 30 minutes.

    \n\n

    Authentication and join rate limits are:

    \n\n
      \n
    • 20 authenticate attempts per 10 seconds per user (200 for verified bots)
    • \n
    • 20 join attempts per 10 seconds per user (2000 for verified bots)
    • \n
    \n\n

    Command and message limits are:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    LimitApplies to
    20 per 30 secondsUsers sending commands or messages to channels in which they do not have Moderator or Operator status
    100 per 30 secondsUsers sending commands or messages to channels in which they have Moderator or Operator status
    \n\n

    For Whispers, which are private chat message between two users:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    LimitApplies to
    3 per second, up to 100 per minute
    40 accounts per day
    Users (not bots)
    10 per second, up to 200 per minute
    500 accounts per day
    Known bots
    20 per second, up to 1200 per minute
    100,000 accounts per day
    Verified bots
    \n\n

    Invalid IRC Commands

    \n\n

    If you send an invalid command, you will get a 421 message back:

    \n\n
    < WHO #<channel>\n> :tmi.twitch.tv 421 <user> WHO :Unknown command\n
    \n\n

    Generic IRC Commands

    \n\n

    The Twitch API does not support WHO, part of the IRC specification.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CapabilityDescription
    [JOIN](#join)Join a channel.
    [PART](#part)Leave a channel.
    [PRIVMSG](#privmsg)Send a message to a channel.
    \n\n

    JOIN

    \n\n

    Join a channel.

    \n\n
    < JOIN #<channel>\n> :<user>!<user>@<user>.tmi.twitch.tv JOIN #<channel>\n> :<user>.tmi.twitch.tv 353 <user> = #<channel> :<user>\n> :<user>.tmi.twitch.tv 366 <user> #<channel> :End of /NAMES list\n
    \n\n

    To receive commands related to the users in the channel  (JOIN, MODE, NAMES, and PART) after a successful JOIN, you must request the Twitch-specific Membership capability.

    \n\n

    If you try to join a suspended or deleted channel, you get a msg_channel_suspended NOTICE. If you try to join a nonexistent channel, the JOIN is quietly dropped.

    \n\n

    PART

    \n\n

    Leave a channel.

    \n\n
    < PART #<channel>\n> :<user>!<user>@<user>.tmi.twitch.tv PART #<channel>\n
    \n\n

    PRIVMSG

    \n\n

    Send a message to a channel.

    \n\n
    < PRIVMSG #<channel> :This is a sample message\n> :<user>!<user>@<user>.tmi.twitch.tv PRIVMSG #<channel> :This is a sample message\n
    \n\n

    Scopes for IRC Commands

    \n\n

    Twitch slash commands are sent via PRIVMSG. The following table lists these commands and required scopes.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    CommandRequired Scope

    /ban, /unban

    channel:moderate
    /clearchannel:moderate
    /colorchat:edit
    /commercialchannel_commercial
    /deletechannel:moderate
    /disconnectchat:edit

    /emoteonly, /emoteonlyoff

    channel:moderate

    /followers, /followersoff

    channel:moderate
    /helpchat:edit

    /host, /unhost

    channel_editor
    /markerchannel_editor
    /mechat:edit

    /mod, /unmod

    channel:moderate
    /modschat:edit

    /r9kbeta, /r9kbetaoff

    channel:moderate

    /raid, /unraid

    channel_editor

    /slow, /slowoff

    channel:moderate

    /subscribers, /subscribersoff

    channel:moderate

    /timeout, /untimeout

    channel:moderate
    \n/vip, /unvip\nchannel:moderate
    /vipschat:edit
    /wwhispers:edit
    \n\n

    Twitch IRC Capabilities

    \n\n

    Using IRC v3 capability registration, you can register for Twitch-specific capabilities, to access Twitch-specific commands, data, etc.

    \n\n

    Due to caching, events are not sent to a channel immediately; instead, they are batched and sent every 10 seconds.

    \n\n

    All elevated users are given operator privileges. To determine a user’s actual elevation level, request the tags capability and parse the user-type tag.

    \n\n

    There are several Twitch-specific capabilities:

    \n\n
      \n
    • \n

      Membership: Adds membership state event data. By default, we do not send this data to clients without this capability.

      \n\n
      \n
      < CAP REQ :twitch.tv/membership\n> :tmi.twitch.tv CAP * ACK :twitch.tv/membership\n
      \n
    • \n
    • \n

      Tags: Adds IRC V3 message tags to several commands, if enabled with the commands capability.

      \n\n
      \n
      < CAP REQ :twitch.tv/tags\n> :tmi.twitch.tv CAP * ACK :twitch.tv/tags\n
      \n
    • \n
    • \n

      Commands: Enables several Twitch-specific commands.

      \n\n
      \n
      < CAP REQ :twitch.tv/commands\n> :tmi.twitch.tv CAP * ACK :twitch.tv/commands\n
      \n\n
      \n
      < CAP REQ :twitch.tv/tags twitch.tv/commands\n
      \n
    • \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","migration":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Overview
    \n\t\t\n\t\t\t
    Authentication Tokens and Headers
    \n\t\t\n\t\t\t
    Rate Limits
    \n\t\t\n\t\t\t
    Authentication Scopes
    \n\t\t\n\t\t\t
    Endpoint Equivalence
    \n\t\t\n\t\n\n\n\t\t

    v5 to Twitch API Migration Guide

    \n\n

    Overview

    \n\n

    We are providing the following guide with information and resources to help migrate existing v5 integrations to the Twitch API that uses the Helix namespace.

    \n\n

    This guide may not be exhaustive, however it should cover the most common differences between the APIs that you’ll need to know when using the latest endpoints.

    \n\n

    Authentication Tokens and Headers

    \n\n

    OAuth tokens are required when requesting Twitch API endpoints. This differs from v5 where most endpoints only required the Client ID header. You will also need to use the word “Bearer” in the Authorization header instead of “OAuth.” Here is a curl example that demonstrates how to send your Client ID and OAuth token for endpoints in the Helix namespace.

    \n\n
    curl -H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-X GET 'https://api.twitch.tv/helix/channels?broadcaster_id=12826'\n
    \n\n

    Many endpoints can be requested using an app access token which will let you access non-user specific public information. Although you cannot request most scopes with this type of token, it is useful for making calls to the search endpoints, stream status endpoints, or other similar endpoints that do not require user authorization to provide privileged information (such as the subscribers endpoints which require the broadcaster to approve of third-party access). In these cases, or to scale your application for more users, consider user access tokens.

    \n\n

    You can find some examples showing how to generate and use access tokens for the Twitch API in our Community Code resource.

    \n\n

    Rate Limits

    \n\n

    The Twitch API has introduced rate limits not present in v5. As such, you may need to consider some changes to your application for the information you are requesting. For example, instead of relying on an app access token that has a set rate limit, consider using a user access token in which case each user of your application is given a rate limit allowing your development to scale as your users increase. You may also need to consider timing requests to fit within the limits if an app access token must be used.

    \n\n

    The Twitch API has a rate limit of 800 points per minute and you can use the response headers of API requests to monitor your usage to adjust as needed. For more information, please see our rate limit documentation.

    \n\n

    Two common API use cases involve requesting streams for live streaming status and requesting users to get their username or user id. As such, we want to remind you that up to 100 streams or users can be requested in a single request, which can help an application operate within the rate limits.

    \n\n

    Authentication Scopes

    \n\n

    As is the case for many developers, you may already have broadcasters or users who have authorized your application to access information about their accounts. Since we want to minimize the disruption for your users, we are allowing some v5 authentication scopes to be used for requests to the latest version of the API. This means you will not have to prompt broadcasters or users to re-authenticate when switching your development from v5 endpoints to the latest endpoints.

    \n\n

    When implementing one our our latest endpoints for the first time, for example, adding functionality that you did not provide with v5 endpoints, it is preferable to use the Helix scope instead of one of the v5 scopes that have been added as a migration convenience. You can find more information about scopes in our authentication documentation. As the following table indicates, each v5 scope maps to one or more Helix scopes; we will treat the v5 scope as an equivalent when making calls to endpoints in the Helix namespace.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    v5 ScopeHelix Scope
    channel_subscriptionschannel:read:subscriptions
    channel_commercialchannel:edit:commercial
    channel_editor\nchannel:manage:broadcast
    channel:manage:videos\n
    user_follows_edituser:edit:follows
    channel_read\nchannel:read:editors
    channel:read:stream_key
    user:read:email\n
    user_readuser:read:email
    user_blocks_readuser:read:blocked_users
    user_blocks_edituser:manage:blocked_users
    \n\n

    Endpoint Equivalence

    \n\n

    Each v5 endpoint that has an equivalent endpoint in our latest version of the API is listed in the following table to help update your application during the migration period.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    v5 EndpointNewest EndpointDescription/Notes
    Bits  
    Get CheermotesGet CheermotesRetrieves information about the available cheermotes.
    Channels  
    Get ChannelGet Channel InformationRetrieve information about a Twitch channel specified by the broadcaster_id. The user associated with a user access token is not assumed.
    Get Channel by IDGet Channel InformationRetrieve information about a Twitch channel. Channel ID is synonymous with broadcaster_id.
    Update ChannelModify Channel InformationModify the title or game of a Twitch channel.
    Get Channel EditorsGet Channel Editors 
    Get Channel FollowersGet Users FollowsGet a list of users who follow a Twitch channel. The to_id query parameter must be used.
    Get Channel SubscribersGet Broadcaster SubscriptionsThe broadcaster_id in the newest endpoint must match the user in the OAuth token.
    Get Channel VideosGet Videos 
    Start CommercialStart Commercial 
    Clips  
    Get ClipGet Clips\nid in the new endpoint is equivalent to slug in the v5 endpoint.
    Get Top ClipsGet Clips\nbroadcast_id must be used in the new endpoint rather than the channel name used by the v5 endpoint.
    Get Followed ClipsGet ClipsWhile not an exact equivalent, the latest “Get Clips” endpoint has an optional game_id parameter to get top Clips for a specific game.
    Games  
    Get Top GamesGet Top Games 
    Search  
    Search ChannelsSearch Channels 
    Search GamesSearch Categories“Categories” are synonymous with “Games” from the older endpoint.
    Search Streams\nSearch Channels OR Search Categories\nThe v5 endpoint searched for the channel title and category. Use “Search Channels” to match channel name or title. Use “Search Categories” to match a category.
    Streams  
    Get Stream by UserGet Streams\nuser_id is synonymous with channel ID. To get the game name, call “Get Games” with the returned game_id\n
    Get Live StreamsGet StreamsFilters differ slightly. Uses game_id, user_id, and user_login. stream_type not available.
    Get Followed Streams\nGet Users Follows + Get Streams\nUse “Get Users Follows” to get the user_ids followed, then provide this list as a query parameter for “Get Streams.”
    Users  
    Get UserGet UsersOmit id and login to lookup a user by the Bearer token.
    Get User by IDGet Users\nid is synonymous with user ID.
    Get UsersGet Users 
    Get User FollowsGet Users FollowsInclude only the from_id parameter.
    Check User Follows by ChannelGet Users FollowsInclude the from_id and to_id parameters.
    Follow ChannelCreate User Follows\nfrom_id is synonymous with user ID. channel ID is synonymous with to_id.
    Unfollow ChannelDelete User Follows\nfrom_id is synonymous with user ID. channel ID is synonymous with to_id.
    Get User Block ListGet User Block List 
    Block UserBlock User 
    Unblock UserUnblock User 
    Create User Connection to Viewer Heartbeat Service (VHS)Deprecated as of August 18, 2020.Use the latest version of Drops.
    Check User Connection to Viewer Heartbeat Service (VHS)Deprecated as of August 18, 2020.Use the latest version of Drops.
    Delete User Connection to Viewer Heartbeat Service (VHS)Deprecated as of August 18, 2020.Use the latest version of Drops.
    Videos  
    Get VideoGet Videos\nid is synonymous with video ID.
    Get Top VideosGet VideosUses game_id instead of game name.
    Get Followed Videos\nGet Users Follows + Get Videos\nUse “Get Users Follows” to get the user_ids followed, then call “Get Videos” for each user_id you would like to retrieve videos for.
    Delete VideoDelete Videos 
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","reference":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Gets a list of polls that the broadcaster created
    \n\t\t\n\t\t\t
    Creates a prediction
    \n\t\t\n\t\t\t
    Gets all emoticons that the specified Twitch channel created
    \n\t\t\n\t\t\t
    Gets all global emoticons
    \n\t\t\n\t\t\t
    Gets emoticons for one or more specified emote sets
    \n\t\t\n\t\t\t
    Start Commercial
    \n\t\t\n\t\t\t
    Get Extension Analytics
    \n\t\t\n\t\t\t
    Get Game Analytics
    \n\t\t\n\t\t\t
    Get Bits Leaderboard
    \n\t\t\n\t\t\t
    Get Cheermotes
    \n\t\t\n\t\t\t
    Get Extension Transactions
    \n\t\t\n\t\t\t
    Get Channel Information
    \n\t\t\n\t\t\t
    Modify Channel Information
    \n\t\t\n\t\t\t
    Get Channel Editors
    \n\t\t\n\t\t\t
    Create Custom Rewards
    \n\t\t\n\t\t\t
    Delete Custom Reward
    \n\t\t\n\t\t\t
    Get Custom Reward
    \n\t\t\n\t\t\t
    Get Custom Reward Redemption
    \n\t\t\n\t\t\t
    Update Custom Reward
    \n\t\t\n\t\t\t
    Update Redemption Status
    \n\t\t\n\t\t\t
    Get Channel Emotes
    \n\t\t\n\t\t\t
    Get Global Emotes
    \n\t\t\n\t\t\t
    Get Emote Sets
    \n\t\t\n\t\t\t
    Get Channel Chat Badges
    \n\t\t\n\t\t\t
    Get Global Chat Badges
    \n\t\t\n\t\t\t
    Create Clip
    \n\t\t\n\t\t\t
    Get Clips
    \n\t\t\n\t\t\t
    Get Code Status
    \n\t\t\n\t\t\t
    Get Drops Entitlements
    \n\t\t\n\t\t\t
    Redeem Code
    \n\t\t\n\t\t\t
    Create EventSub Subscription
    \n\t\t\n\t\t\t
    Delete EventSub Subscription
    \n\t\t\n\t\t\t
    Get EventSub Subscriptions
    \n\t\t\n\t\t\t
    Get Top Games
    \n\t\t\n\t\t\t
    Get Games
    \n\t\t\n\t\t\t
    Get Hype Train Events
    \n\t\t\n\t\t\t
    Check AutoMod Status
    \n\t\t\n\t\t\t
    Manage Held AutoMod Messages
    \n\t\t\n\t\t\t
    Get Banned Events
    \n\t\t\n\t\t\t
    Get Banned Users
    \n\t\t\n\t\t\t
    Get Moderators
    \n\t\t\n\t\t\t
    Get Moderator Events
    \n\t\t\n\t\t\t
    Get Polls
    \n\t\t\n\t\t\t
    Create Poll
    \n\t\t\n\t\t\t
    End Poll
    \n\t\t\n\t\t\t
    Get Predictions
    \n\t\t\n\t\t\t
    Create Prediction
    \n\t\t\n\t\t\t
    End Prediction
    \n\t\t\n\t\t\t
    Search Categories
    \n\t\t\n\t\t\t
    Search Channels
    \n\t\t\n\t\t\t
    Get Stream Key
    \n\t\t\n\t\t\t
    Get Streams
    \n\t\t\n\t\t\t
    Get Followed Streams
    \n\t\t\n\t\t\t
    Create Stream Marker
    \n\t\t\n\t\t\t
    Get Stream Markers
    \n\t\t\n\t\t\t
    Get Broadcaster Subscriptions
    \n\t\t\n\t\t\t
    Check User Subscription
    \n\t\t\n\t\t\t
    Get All Stream Tags
    \n\t\t\n\t\t\t
    Get Stream Tags
    \n\t\t\n\t\t\t
    Replace Stream Tags
    \n\t\t\n\t\t\t
    Get Channel Teams
    \n\t\t\n\t\t\t
    Get Teams
    \n\t\t\n\t\t\t
    Get Users
    \n\t\t\n\t\t\t
    Update User
    \n\t\t\n\t\t\t
    Get Users Follows
    \n\t\t\n\t\t\t
    Create User Follows
    \n\t\t\n\t\t\t
    Delete User Follows
    \n\t\t\n\t\t\t
    Get User Block List
    \n\t\t\n\t\t\t
    Block User
    \n\t\t\n\t\t\t
    Unblock User
    \n\t\t\n\t\t\t
    Get User Extensions
    \n\t\t\n\t\t\t
    Get User Active Extensions
    \n\t\t\n\t\t\t
    Update User Extensions
    \n\t\t\n\t\t\t
    Get Videos
    \n\t\t\n\t\t\t
    Pagination Support
    \n\t\t\n\t\t\t
    Delete Videos
    \n\t\t\n\t\t\t
    Get Webhook Subscriptions
    \n\t\t\n\t\n\n\n\t\t
    \n
    \n \t
    \n \t\t

    Twitch API Reference

    \n\n \t\t\n \t\t\t\n \t\t\t\t\n \n \t\t\t\t\t\n \t\t\t\t\t\n \t\t\t\t\n \t\t\t\n \t\t\t\n \t\t\t\t\n \n \n \n \n \n\n \n \t\t\t\t\n \n \n \n \n \n\n \n \t\t\t\t\n \n \n \n \n \n \n\n\n \n \n \n \n\n\n \n \n \n \n\n\n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \n \n \n \n \n \n \n \n \n \t\t\t\t\n \t\t\t\n \t\t
    ResourceEndpointDescription
    PollsGets a list of polls that the broadcaster createdGets a list of polls that the broadcaster created. You can get all polls or you can filter the list for specific polls. Information about a poll is available for 90 days after being created.\n\nRequires a User access token with scope set to **channel:read:polls**.
    PredictionsCreates a predictionCreates a prediction. The broadcaster poses a question and viewers try to predict the outcome. The prediction runs as soon as it's created. You may run only one prediction at a time.\n\nRequires a User access token with scope set to **channel:manage:predictions**.
    EmotesGets all emoticons that the specified Twitch channel createdGets all emoticons that the specified Twitch channel created. Broadcasters create these custom emoticons for users who subscribe to or follow the channel, or cheer Bits in the channel’s chat window. For information about the custom emotes, see [subscriber emotes](https://help.twitch.tv/s/article/subscriber-emote-guide), [Bits tier emotes](https://help.twitch.tv/s/article/custom-bit-badges-guide?language=bg#slots), and [follower emotes](https://blog.twitch.tv/en/2021/06/04/kicking-off-10-years-with-our-biggest-emote-update-ever/). [Learn more](https://dev.twitch.tv/docs/irc/emotes).\n\nNOTE: With the exception of custom follower emotes, users may use custom emotes in any Twitch chat.\n\nRequires an App access token.
    EmotesGets all global emoticonsGets all [global emotes](https://www.twitch.tv/creatorcamp/en/learn-the-basics/emotes/). Global emotes are Twitch-created emoticons that users can use in any Twitch chat. [Learn more](https://dev.twitch.tv/docs/irc/emotes).\n\nRequires an App access token.
    EmotesGets emoticons for one or more specified emote setsGets the emoticons found in one or more specified emote sets. An emote set groups emoticons that have a similar context. For example, Twitch places all the subscriber emotes that a broadcaster uploads for their channel in the same emote set. [Learn more](https://dev.twitch.tv/docs/irc/emotes).\n\nRequires an App access token.
    AdsStart Commercial\n

    Starts a commercial on a specified channel.

    \n
    AnalyticsGet Extension Analytics\n

    Gets a URL that Extension developers can use to download analytics reports (CSV files) for their Extensions. The URL is valid for 5 minutes. For details about analytics and the fields returned, see the Insights & Analytics guide.

    \n
    AnalyticsGet Game Analytics\n

    Gets a URL that game developers can use to download analytics reports (CSV files) for their games. The URL is valid for 5 minutes.

    \n
    BitsGet Bits Leaderboard\n

    Gets a ranked list of Bits leaderboard information for an authorized broadcaster.

    \n
    BitsGet Cheermotes\n

    Retrieves the list of available Cheermotes, animated emotes to which viewers can assign Bits, to cheer in chat. Cheermotes returned are available throughout Twitch, in all Bits-enabled channels.

    \n
    BitsGet Extension Transactions\n

    Get Extension Transactions allows extension back end servers to fetch a list of transactions that have occurred for their extension across all of Twitch.

    \n
    ChannelsGet Channel Information\n

    Gets channel information for users.

    \n
    ChannelsModify Channel Information\n

    Modifies channel information for users.

    \n
    ChannelsGet Channel Editors\n

    Gets a list of users who have editor permissions for a specific channel.

    \n
    Channel PointsCreate Custom Rewards\n

    Creates a Custom Reward on a channel.

    \n\n

     

    \n
    Channel PointsDelete Custom Reward\n

    Deletes a Custom Reward on a channel.

    \n
    Channel PointsGet Custom Reward\n

    Returns a list of Custom Reward objects for the Custom Rewards on a channel.

    \n
    Channel PointsGet Custom Reward Redemption\n

    Returns Custom Reward Redemption objects for a Custom Reward on a channel that was created by the same client_id

    \n
    Channel PointsUpdate Custom Reward\n

    Updates a Custom Reward created on a channel.

    \n
    Channel PointsUpdate Redemption Status\n

    Updates the status of Custom Reward Redemption objects on a channel that are in the UNFULFILLED status.

    \n
    ChatGet Channel Emotes\n

    NEW Gets all custom emotes for a specific Twitch channel including subscriber emotes and Bits tier emotes. Custom channel emotes are custom emoticons that viewers may use in Twitch chat once they are subscribed to, cheered in, or followed the channel that owns the emotes.

    \n
    ChatGet Global Emotes\n

    NEW Gets all global emotes. Global emotes are Twitch-specific emoticons that every user can use in Twitch chat.

    \n
    ChatGet Emote Sets\n

    NEW Gets all Twitch emotes for one or more specific emote sets.

    \n
    ChatGet Channel Chat Badges\n

    NEW Gets a list of custom chat badges that can be used in chat for the specified channel.

    \n
    ChatGet Global Chat Badges\n

    NEW Gets a list of chat badges that can be used in chat for any channel.

    \n
    ClipsCreate Clip\n

    Creates a clip programmatically. This returns both an ID and an edit URL for the new clip.

    \n
    ClipsGet Clips\n

    Gets clip information by clip ID (one or more), broadcaster ID (one only), or game ID (one only).

    \n
    EntitlementsGet Code Status\n

    Gets the status of one or more provided codes. This API requires that the caller is an authenticated Twitch user. The API is throttled to one request per second per authenticated user.

    \n
    EntitlementsGet Drops Entitlements\n

    Gets a list of entitlements for a given organization that have been granted to a game, user, or both.

    \n
    EntitlementsRedeem Code\n

    Redeems one or more provided codes to the authenticated Twitch user. This API requires that the caller is an authenticated Twitch user. This API requires that the caller is an authenticated Twitch user. The API is throttled to one request per second per authenticated user.

    \n
    EventSubCreate EventSub Subscription\n

    Creates an EventSub subscription.

    \n
    EventSubDelete EventSub Subscription\n

    Delete an EventSub subscription.

    \n
    EventSubGet EventSub Subscriptions\n

    Get a list of your EventSub subscriptions. The subscriptions are paginated and ordered by most recent first.

    \n
    GamesGet Top Games\n

    Gets games sorted by number of current viewers on Twitch, most popular first.

    \n
    GamesGet Games\n

    Gets game information by game ID or name.

    \n
    Hype TrainGet Hype Train Events\n

    Gets the information of the most recent Hype Train of the given channel ID.

    \n
    ModerationCheck AutoMod Status\n

    Determines whether a string message meets the channel’s AutoMod requirements.

    \n
    ModerationManage Held AutoMod Messages\n

    Allow or deny a message that was held for review by AutoMod.

    \n
    ModerationGet Banned Events\n

    Returns all user bans and un-bans in a channel.

    \n
    ModerationGet Banned Users\n

    Returns all banned and timed-out users in a channel.

    \n
    ModerationGet Moderators\n

    Returns all moderators in a channel.

    \n
    ModerationGet Moderator Events\n

    Returns a list of moderators or users added and removed as moderators from a channel.

    \n
    PollsGet Polls\n

    NEW Get information about all polls or specific polls for a Twitch channel. Poll information is available for 90 days.

    \n
    PollsCreate Poll\n

    NEW Create a poll for a specific Twitch channel.

    \n
    PollsEnd Poll\n

    NEW End a poll that is currently active.

    \n
    PredictionsGet Predictions\n

    NEW Get information about all Channel Points Predictions or specific Channel Points Predictions for a Twitch channel.

    \n
    PredictionsCreate Prediction\n

    NEW Create a Channel Points Prediction for a specific Twitch channel.

    \n
    PredictionsEnd Prediction\n

    NEW Lock, resolve, or cancel a Channel Points Prediction.

    \n
    SearchSearch Categories\n

    Returns a list of games or categories that match the query via name either entirely or partially.

    \n
    SearchSearch Channels\n

    Returns a list of channels that match the query via channel name or description either entirely or partially.

    \n
    StreamsGet Stream Key\n

    Gets the channel stream key for a user.

    \n
    StreamsGet Streams\n

    Gets information about active streams. Streams are returned sorted by number of current viewers, in descending order.

    \n
    StreamsGet Followed Streams\n

    Gets information about active streams belonging to channels that the authenticated user follows.

    \n
    StreamsCreate Stream Marker\n

    Creates a marker in the stream of a user specified by user ID. A marker is an arbitrary point in a stream that the broadcaster wants to mark.

    \n
    StreamsGet Stream Markers\n

    Gets a list of markers for either a specified user’s most recent stream or a specified VOD/video (stream), ordered by recency. A marker is an arbitrary point in a stream that the broadcaster wants to mark.

    \n
    SubscriptionsGet Broadcaster Subscriptions\n

    Gets all of a broadcaster’s subscriptions.

    \n
    SubscriptionsCheck User Subscription\n

    Checks if a specific user is subscribed to a specific channel.

    \n
    TagsGet All Stream Tags\n

    Gets the list of all stream tags defined by Twitch, optionally filtered by tag ID(s).

    \n
    TagsGet Stream Tags\n

    Gets the list of current stream tags that have been set for a channel.

    \n
    TagsReplace Stream Tags\n

    Applies specified tags to a specified stream, overwriting any existing tags applied to that stream.

    \n
    TeamsGet Channel Teams\n

    Retrieves a list of Twitch Teams of which the specified channel/broadcaster is a member.

    \n
    TeamsGet Teams\n

    Gets information for a specific Twitch Team.

    \n
    UsersGet Users\n

    Gets information about one or more specified Twitch users. Users are identified by optional user IDs and/or login name.

    \n
    UsersUpdate User\n

    Updates the description of a user specified by a Bearer token.

    \n
    UsersGet Users Follows\n

    Gets information on follow relationships between two Twitch users. Information returned is sorted in order, most recent follow first.

    \n
    UsersCreate User Follows\n

    Adds a specified user to the followers of a specified channel.

    \n
    UsersDelete User Follows\n

    Deletes a specified user from the followers of a specified channel.

    \n
    UsersGet User Block List\n

    Gets a specified user’s block list. The list is sorted by when the block occurred in descending order (i.e. most recent block first).

    \n
    UsersBlock User\n

    Blocks the specified user on behalf of the authenticated user.

    \n
    UsersUnblock User\n

    Unblocks the specified user on behalf of the authenticated user.

    \n
    UsersGet User Extensions\n

    Gets a list of all extensions (both active and inactive) for a specified user, identified by a Bearer token.

    \n
    UsersGet User Active Extensions\n

    Gets information about active extensions installed by a specified user, identified by a user ID or Bearer token.

    \n
    UsersUpdate User Extensions\n

    Updates the activation state, extension ID, and/or version number of installed extensions for a specified user, identified by a Bearer token.

    \n
    VideosGet Videos\n

    Gets video information by one or more video IDs, user ID, or game ID.

    \n
    VideosDelete Videos\n

    Deletes one or more videos. Videos are past broadcasts, Highlights, or uploads.

    \n
    WebhooksGet Webhook Subscriptions\n

    Gets the Webhook subscriptions of an application identified by a Bearer token, in order of expiration.

    \n
    \n \t
    \n
    \n
    \n\n \n \n
    \n
    \n

    Gets a list of polls that the broadcaster created

    \n \n GET https://api/twitch.tv/helix/polls\n \n

    \n

    Gets a list of polls that the broadcaster created. You can get all polls or you can filter the list for specific polls. Information about a poll is available for 90 days after being created.

    \n\n

    Requires a User access token with scope set to channel:read:polls.

    \n\n \n

    Authorization

    \n

    \n \n \n \n Token: User OAuth Token
    \n Scopes: channel:read:polls\n \n \n

    \n \n \n \n \n
    \n

    Query Parameters

    \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameDescription
    \n broadcaster_id\n required\n \n string\n

    The ID of the broadcaster that's running the poll. This ID must match the user ID associated with the user OAuth token. In other words, only the broadcaster can see their polls.

    \n
    \n id\n \n \n array\n

    A list of IDs that identify the polls to return. Specify this parameter only if you want to filter the list that the request returns.\n\nTo specify more than one ID, include this parameter for each poll you want to get. For example, id=1234&id=5678. You may specify a maximum of 20 IDs.

    \n
    \n first\n \n \n integer\n

    The maximum number of polls to return per page in the response. The minimum page size is 1 poll per page and the maximum is 20 polls per page. The default is 20.

    \n
    \n after\n \n \n string\n

    The cursor used to get the next page of results. The **Pagination** object in the response contains the cursor’s value. [Read more](https://dev.twitch.tv/docs/api/guide#pagination).

    \n
    \n
    \n\n \n\n \n \n \n \n \n \n

    Response Codes

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMessage
    200Success response for Get Polls API
    401Unauthorized
    500Internal Server Error
    \n \n

    Response Values

    \n \n // TODO\n \n
    \n
    \n \n // TODO: May or may not be built from the spec\n \n
    \n
    \n \n \n \n \n
    \n
    \n

    Creates a prediction

    \n \n POST https://api/twitch.tv/helix/predictions\n \n

    \n

    Creates a prediction. The broadcaster poses a question and viewers try to predict the outcome. The prediction runs as soon as it’s created. You may run only one prediction at a time.

    \n\n

    Requires a User access token with scope set to channel:manage:predictions.

    \n\n \n

    Authorization

    \n

    \n \n \n \n Token: User OAuth Token
    \n Scopes: channel:manage:predictions\n \n \n

    \n \n \n \n \n \n\n \n \n \n
    \n

    Body Parameters

    \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameDescription
    \n broadcaster_id\n required\n \n string\n

    The ID of the broadcaster that's running the prediction. This ID must match the user ID associated with the user OAuth token.

    \n
    \n outcomes\n required\n \n array\n

    The list of possible outcomes for the prediction. The list must contain two choices.

    \n
    \n prediction_window\n required\n \n integer\n

    The length of time (in seconds) that the prediction will run for. The minimum is 30 second and the maximum is 1800 seconds (30 minutes).

    \n
    \n title\n required\n \n string\n

    The question that the broadcaster is asking. For example, *Will I finish this entire pizza?*

    \n
    \n
    \n\n \n \n \n

    Response Codes

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMessage
    200Success response for Post Predictions API
    400BadRequest
    401Unauthorized
    500Internal Server Error
    \n \n

    Response Values

    \n \n // TODO\n \n
    \n
    \n \n // TODO: May or may not be built from the spec\n \n
    \n
    \n \n \n \n \n \n
    \n
    \n

    Gets all emoticons that the specified Twitch channel created

    \n \n GET https://api/twitch.tv/helix/chat/emotes\n \n

    \n

    Gets all emoticons that the specified Twitch channel created. Broadcasters create these custom emoticons for users who subscribe to or follow the channel, or cheer Bits in the channel’s chat window. For information about the custom emotes, see subscriber emotes, Bits tier emotes, and follower emotes. Learn more.

    \n\n

    NOTE: With the exception of custom follower emotes, users may use custom emotes in any Twitch chat.

    \n\n

    Requires an App access token.

    \n\n \n

    Authorization

    \n

    \n \n \n \n \n

    \n \n \n \n \n
    \n

    Query Parameters

    \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameDescription
    \n broadcaster_id\n required\n \n string\n

    An ID that identifies the broadcaster whose emoticons you want to get.

    \n
    \n
    \n\n \n\n \n \n \n \n \n \n

    Response Codes

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMessage
    200Success response for Get Channel Emotes API
    401Unauthorized
    500Internal Server Error
    \n \n

    Response Values

    \n \n // TODO\n \n
    \n
    \n \n // TODO: May or may not be built from the spec\n \n
    \n
    \n \n\n
    \n
    \n

    Gets all global emoticons

    \n \n GET https://api/twitch.tv/helix/chat/emotes/global\n \n

    \n

    Gets all global emotes. Global emotes are Twitch-created emoticons that users can use in any Twitch chat. Learn more.

    \n\n

    Requires an App access token.

    \n\n \n

    Authorization

    \n

    \n \n \n \n \n

    \n \n \n \n \n \n\n \n \n \n \n \n \n

    Response Codes

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMessage
    200Success response for Get Global Emotes API
    401Unauthorized
    500Internal Server Error
    \n \n

    Response Values

    \n \n // TODO\n \n
    \n
    \n \n // TODO: May or may not be built from the spec\n \n
    \n
    \n \n\n
    \n
    \n

    Gets emoticons for one or more specified emote sets

    \n \n GET https://api/twitch.tv/helix/chat/emotes/set\n \n

    \n

    Gets the emoticons found in one or more specified emote sets. An emote set groups emoticons that have a similar context. For example, Twitch places all the subscriber emotes that a broadcaster uploads for their channel in the same emote set. Learn more.

    \n\n

    Requires an App access token.

    \n\n \n

    Authorization

    \n

    \n \n \n \n \n

    \n \n \n \n \n
    \n

    Query Parameters

    \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameDescription
    \n emote_set_id\n required\n \n array\n

    An ID that identifies the emote set to get. Include the parameter for each emote set you want to get. For example, `emote_set_id=1234&emote_set_id=5678`. You may specify a maximum of 25 IDs.

    \n
    \n
    \n\n \n\n \n \n \n \n \n \n

    Response Codes

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMessage
    200Success response for Get Emote Sets API
    401Unauthorized
    500Internal Server Error
    \n \n

    Response Values

    \n \n // TODO\n \n
    \n
    \n \n // TODO: May or may not be built from the spec\n \n
    \n
    \n \n\n \n \n \n
    \n
    \n

    Start Commercial

    \n \n \n

    Starts a commercial on a specified channel.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth Token required
    • \n
    • Required scope: channel:edit:commercial\n
    • \n
    \n\n

    Pagination Support

    \n\n

    None

    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/channels/commercial

    \n\n

    Required Query Parameter

    \n\n

    None

    \n\n

    Required Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID of the channel requesting a commercial
    Minimum: 1 Maximum: 1
    lengthintegerDesired length of the commercial in seconds. 
    Valid options are 30, 60, 90, 120, 150, 180.
    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    lengthintegerLength of the triggered commercial
    messagestringProvides contextual information on why the request failed
    retry_afterintegerSeconds until the next commercial can be served on this channel
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request starts a commercial.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/channels/commercial' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{\n  \"broadcaster_id\": \"41245072\",\n  \"length\": 60\n}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [{\n    \"length\" : 60,\n    \"message\" : \"\",\n    \"retry_after\" : 480\n  }]\n}\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Extension Analytics

    \n \n \n

    Gets a URL that Extension developers can use to download analytics reports (CSV files) for their Extensions. The URL is valid for 5 minutes.

    \n\n

    If you specify a future date, the response will be “Report Not Found For Date Range.” If you leave both started_at and ended_at blank, the API returns the most recent date of data.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: analytics:read:extensions\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/analytics/extensions

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. This applies only to queries without extension_id. If an extension_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    ended_atstringEnding date/time for returned reports, in RFC3339 format with the hours, minutes, and seconds zeroed out and the UTC timezone: YYYY-MM-DDT00:00:00Z. The report covers the entire ending date; e.g., if 2018-05-01T00:00:00Z is specified, the report covers up to 2018-05-01T23:59:59Z.

    If this is provided, started_at also must be specified. If ended_at is later than the default end date, the default date is used. Default: 1-2 days before the request was issued (depending on report availability).
    extension_idstringClient ID value assigned to the extension when it is created. If this is specified, the returned URL points to an analytics report for just the specified extension. If this is not specified, the response includes multiple URLs (paginated), pointing to separate analytics reports for each of the authenticated user’s Extensions.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    started_atstringStarting date/time for returned reports, in RFC3339 format with the hours, minutes, and seconds zeroed out and the UTC timezone: YYYY-MM-DDT00:00:00Z. This must be on or after January 31, 2018.

    If this is provided, ended_at also must be specified. If started_at is earlier than the default start date, the default date is used.  The file contains one row of data per day.
    typestringType of analytics report that is returned. Currently, this field has no affect on the response as there is only one report type. If additional types were added, using this field would return only the URL for the specified report. Limit: 1. Valid values: \"overview_v2\".
    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    ended_atstringReport end date/time.
    extension_idstringID of the extension whose analytics data is being provided.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results. This is returned only if extension_id is not specified in the request.
    started_atstringReport start date/time. Note this may differ from (be later than) the started_at value in the request; the response value is the date when data for the extension is available.
    typestringType of report.
    URLstringURL to the downloadable CSV file containing analytics data. Valid for 5 minutes.
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This gets the URLs for all reports for all Extensions of the authenticated client. For the purpose of this example, assume the request is issued on June 1, 2018.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/analytics/extensions' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response #1

    \n\n
    {\n   \"data\": [\n      {\n         \"extension_id\": \"efgh\",\n         \"URL\": \"https://twitch-piper-reports.s3-us-west-2.amazonaws.com/dynamic/LoL%20ADC_overview_v2_2018-03-01_2018-06-01_8a879932-8e70-7a4c-2b97-e0eaba28c3b0.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAI7LOPgTrAIVYE6KQ%2F20180731%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180731T202847Z&X-Amz-Expires=60&X-Amz-Security-Token=FQoDYXdzEDMaDObdwyOVISdo6feHSSK3A9R9gMFeS5frG5Dsr4k4tJemqCIazhsQJrpsehBoOufaQkCxrb8RD3oU0xC5pWrZe9kN%2BnezIoLOgTtFRAqTzdIr7J5iUOxGFyKN9XmrmUHGexFfALvoPQWUJNbxoFU6shajSmO3sPK2GnuEaGmIrAqjKrim8saLHDV%2FdSi2ZH3fFx6sBQEGv13Lx0zua7AsvaL%2BSfhIAcOazWjYLMU5N9bxXmaN7IAIF4UjNPqbg07RMWW70hm0edH0RPi%2Fw00faeeSvmreHq6c1C1Lu8a7AysMb0pEGBT7VxmuGmWsXyjLWZ6oNgbx88HXoMJpmAn5Y1hUu7VzOaa84T%2BmCF5Sbn7hbB1xIiPdzaVQ%2Bd85sy4ln09h7dgKh6GFE1VTas2v7RJU1lyD%2FZ%2FWKBwV5Ol8GEGrF1pme8mSBpPGUAJ4vxjLmrGL7ctty%2F0vXke3PyD%2B4%2FtHZ67xaw0y8EKrau23Xvt3blkcDNoQYOfcS%2FqbaK%2BHpyVq4bIBtQq%2BHYU5MuFkgEuwSe5zPDle1ysKSN11B6B6Sy7Httrq542OONS%2BfURkczMbKSPEShddN32Y9VUqKYdUo%2FsWVQQoy7uC2wU%3D&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3Bfilename%3D%22WoW%20Armory_overview_v1_2018-04-30_2018-06-01.csv%22&X-Amz-Signature=eb7721e40cbfd1d7409887dae3792cdb2add025ace953a63ba8e3545b92ae058\",\n         \"type\": \"overview_v2\",\n         \"date_range\": {\n            \"started_at\": \"2018-03-01T00:00:00Z\",\n            \"ended_at\": \"2018-06-01T00:00:00Z\"\n         }\n      },\n      ...\n   ],\n   \"pagination\": {\"cursor\": \"eyJiIjpudWxsLCJhIjp7Ik9mZnNldCI6NX19\"}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Game Analytics

    \n \n \n

    Gets a URL that game developers can use to download analytics reports (CSV files) for their games. The URL is valid for 5 minutes. For detail about analytics and the fields returned, see the Insights & Analytics guide.

    \n\n

    The response has a JSON payload with a data field containing an array of games information elements and can contain a pagination field containing information required to query for more streams.

    \n\n

    If you specify a future date, the response will be “Report Not Found For Date Range.” If you leave both started_at and ended_at blank, the API returns the most recent date of data.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: analytics:read:games\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/analytics/games

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. This applies only to queries without game_id. If a game_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    ended_atstringEnding date/time for returned reports, in RFC3339 format with the hours, minutes, and seconds zeroed out and the UTC timezone: YYYY-MM-DDT00:00:00Z. The report covers the entire ending date; e.g., if 2018-05-01T00:00:00Z is specified, the report covers up to 2018-05-01T23:59:59Z.

    If this is provided, started_at also must be specified. If ended_at is later than the default end date, the default date is used. Default: 1-2 days before the request was issued (depending on report availability).
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    game_idstringGame ID. If this is specified, the returned URL points to an analytics report for just the specified game. If this is not specified, the response includes multiple URLs (paginated), pointing to separate analytics reports for each of the authenticated user’s games.
    started_atstringStarting date/time for returned reports, in RFC3339 format with the hours, minutes, and seconds zeroed out and the UTC timezone: YYYY-MM-DDT00:00:00Z.

    If this is provided, ended_at also must be specified. If started_at is earlier than the default start date, the default date is used. Default: 365 days before the report was issued. The file contains one row of data per day.
    typestringType of analytics report that is returned. Currently, this field has no affect on the response as there is only one report type. If additional types were added, using this field would return only the URL for the specified report. Limit: 1. Valid values: \"overview_v2\".
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    ended_atstringReport end date/time.
    game_idstringID of the game whose analytics data is being provided.
    paginationObject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results. This is returned only if game_id is not specified in the request.
    started_atstringReport start date/time.
    typestringType of report.
    URLstringURL to the downloadable CSV file containing analytics data. Valid for 5 minutes.
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This gets the URL for a downloadable CSV report for game ID 493057, covering the period January 1, 2018 to March 1, 2018.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/analytics/games?game_id=493057&started_at=2018-01-01T00:00:00Z&ended_at=2018-03-01T00:00:00Z' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response #1

    \n\n
    {\n  \"data\": [\n    {\n      \"game_id\" : \"493057\",\n      \"URL\" : \"https://twitch-piper-reports.s3-us-west-2.amazonaws.com/games/66170/overview/1518307200000.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAJP7WFIAF26K7BC2Q%2F20180222%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180222T220651Z&X-Amz-Expires=60&X-Amz-Security-Token=FQoDYXdzEE0aDLKNl9aCgfuikMKI%2ByK3A4e%2FR%2B4to%2BmRZFUuslNKs%2FOxKeySB%2BAU87PBtNGCxQaQuN2Q8KI4Vg%2Bve2x5eenZdoH0ZM7uviM94sf2GlbE9Z0%2FoJRmNGNhlU3Ua%2FupzvByCoMdefrU8Ziiz4j8EJCgg0M1j2aF9f8bTC%2BRYwcpP0kjaZooJS6RFY1TTkh659KBA%2By%2BICdpVK0fxOlrQ%2FfZ6vIYVFzvywBM05EGWX%2F3flCIW%2BuZ9ZxMAvxcY4C77cOLQ0OvY5g%2F7tuuGSO6nvm9Eb8MeMEzSYPr4emr3zIjxx%2Fu0li9wjcF4qKvdmnyk2Bnd2mepX5z%2BVejtIGBzfpk%2Fe%2FMqpMrcONynKoL6BNxxDL4ITo5yvVzs1x7OumONHcsvrTQsd6aGNQ0E3lrWxcujBAmXmx8n7Qnk4pZnHZLgcBQam1fIGba65Gf5Ern71TwfRUsolxnyIXyHsKhd2jSmXSju8jH3iohjv99a2vGaxSg8SBCrQZ06Bi0pr%2FTiSC52U1g%2BlhXYttdJB4GUdOvaxR8n6PwMS7HuAtDJUui8GKWK%2F9t4OON3qhF2cBt%2BnV%2BDg8bDMZkQ%2FAt5blvIlg6rrlCu0cYko4ojb281AU%3D&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3Bfilename%3DWarframe-overview-2018-02-11.csv&X-Amz-Signature=49cc07cbd9d753b00315b66f49b9e4788570062ff3bd956288ab4f164cf96708\",\n      \"type\" : \"overview_v2\",\n      \"date_range\" : {\n        \"started_at\" : \"2018-01-01T00:00:00Z\",\n        \"ended_at\" : \"2018-03-01T00:00:00Z\"\n      }\n    }\n  ]\n}\n
    \n\n

    Example Request #2

    \n\n

    This gets the first 5 URLs (paginated) for all reports for all games of the authenticated client. The request is issued on June 14, 2018.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/analytics/games?first=5' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response #2

    \n\n
    {\n  \"data\": [\n    {\n      \"game_id\": \"9821\",\n      \"URL\": \"https://twitch-piper-reports.s3-us-west-2.amazonaws.com/games/9821/overview/1526428800000.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAJQ4MLJCNPIYDOZ4Q%2F20180517%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20180517T231129Z&X-Amz-Expires=60&X-Amz-Security-Token=FQoDYXdzEK7%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaDD0JCM06UswayN4iVyK3AzIiwI0Qf4KRs2yk9nCiocQOwmMWa7FPJnJEd%2FIxljnmZy%2BphQEEWN3%2Bt8k06wZysfPHvW71zcrIeclv11kNtXaYojC%2FHVKJWO8EnicIQE73kokr16fkf1Q4eglQBuu56jJQoTsEn2UkgZff9XHx69LyFvLYf33ue10CjeJE1bY65%2B6LtcPKciJK%2FNRS1TyUsz%2FiQjyxMEUpAKm39HxNtNKFM5xehjAoWC1KfJc52XVQGFO%2Fm2EQiJj6RoifNkiIQKb4m7nGr86zvIQKDQcxcpVbiGNEcC8UugZgCnuspSPjuJLARb%2BNT%2FjLKopd2%2FUKDlIY%2BAoyEk%2B%2FGIWL5TgvjjmT5uaJ5AcnTm4b7DlV%2FkmDsYHFQez0Mu4%2BwoujZEqR0K%2BtDSyAvva2nUUGabZuDeaaiQD4JfrokXC5GWtninHQCAoPiC4q%2FMYkHS82wxPjJp0l4cStwzEDQ5LJ4cehKm4tCoY1m1whWIJsNuyfLtIUH2rBTuF9D5DFmsmpXiKc4LE9saQgSlLwNBEGASqAbRuy7Tc2ZlcIp1lBllioxhoYL3XcjaXOX3qluWGMwgXdV2Odq0L03MkoxuL31wU%3D&X-Amz-SignedHeaders=host&response-content-disposition=attachment%3Bfilename%3D%22Heroes%20of%20Might%20and%20Magic%20IV-overview_v1-2018-05-16.csv%22&X-Amz-Signature=47af9a041970244b51fa6dd6a31d78ae9ff56a4db76a54d3e1b8a7ec4631defa\",\n      \"type\" : \"overview_v2\",\n      \"date_range\" : {\n        \"started_at\" : \"2018-03-13T00:00:00Z\",\n        \"ended_at\" : \"2018-06-13T00:00:00Z\"\n      }\n    },\n    ...\n  ],\n  \"pagination\": {\"cursor\": \"eyJiIjpudWxsLJxhIjoiIn0gf5\"}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Bits Leaderboard

    \n \n \n

    Gets a ranked list of Bits leaderboard information for an authorized broadcaster.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: bits:read\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/bits/leaderboard

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    countintegerNumber of results to be returned. Maximum: 100. Default: 10.
    periodstringTime period over which data is aggregated (PST time zone). This parameter interacts with started_at. Valid values follow. Default: \"all\".
      \n
    • \n\"day\" – 00:00:00 on the day specified in started_at, through 00:00:00 on the following day.
    • \n
    • \n\"week\" – 00:00:00 on Monday of the week specified in started_at, through 00:00:00 on the following Monday.
    • \n
    • \n\"month\" – 00:00:00 on the first day of the month specified in started_at, through 00:00:00 on the first day of the following month.
    • \n
    • \n\"year\" – 00:00:00 on the first day of the year specified in started_at, through 00:00:00 on the first day of the following year.
    • \n
    • \n\"all\" – The lifetime of the broadcaster's channel. If this is specified (or used by default), started_at is ignored.
    • \n
    \n
    started_atstringTimestamp for the period over which the returned data is aggregated. Must be in RFC 3339 format. If this is not provided, data is aggregated over the current period; e.g., the current day/week/month/year. This value is ignored if period is \"all\".

    Any + operator should be URL encoded.

    Currently, the HH:MM:SS part of this value is used only to identify a given day in PST and otherwise ignored. For example, if the started_at value resolves to 5PM PST yesterday and period is \"day\", data is returned for all of yesterday.
    user_idstringID of the user whose results are returned; i.e., the person who paid for the Bits.

    As long as count is greater than 1, the returned data includes additional users, with Bits amounts above and below the user specified by user_id.

    If user_id is not provided, the endpoint returns the Bits leaderboard data across top users (subject to the value of count).
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    ended_atstringEnd of the date range for the returned data.
    rankintegerLeaderboard rank of the user.
    scoreintegerLeaderboard score (number of Bits) of the user.
    started_atstringStart of the date range for the returned data.
    totalintegerTotal number of results (users) returned. This is count or the total number of entries in the leaderboard, whichever is less.
    user_idstringID of the user (viewer) in the leaderboard entry.
    user_loginstringUser login name.
    user_namestringDisplay name corresponding to user_id.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets information about the top two Bits leaderboard entries for the user specified by Bearer token cfabdegwdoklmawdzdo98xt2fo512y. Information is returned for the current week.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/bits/leaderboard?count=2&period=week' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"user_id\": \"158010205\",\n      \"user_login\": \"tundracowboy\",\n      \"user_name\": \"TundraCowboy\",\n      \"rank\": 1,\n      \"score\": 12543\n    },\n    {\n      \"user_id\": \"7168163\",\n      \"user_login\": \"topramens\",\n      \"user_name\": \"Topramens\",\n      \"rank\": 2,\n      \"score\": 6900\n    }\n  ],\n  \"date_range\": {\n    \"started_at\": \"2018-02-05T08:00:00Z\",\n    \"ended_at\": \"2018-02-12T08:00:00Z\"\n  },\n  \"total\": 2\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Cheermotes

    \n \n \n

    Retrieves the list of available Cheermotes, animated emotes to which viewers can assign Bits, to cheer in chat. Cheermotes returned are available throughout Twitch, in all Bits-enabled channels.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/bits/cheermotes

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required.

    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID for the broadcaster who might own specialized Cheermotes.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    prefixstringThe string used to Cheer that precedes the Bits amount.
    tiersarrayAn array of Cheermotes with their metadata.
    min_bitsintegerMinimum number of bits needed to be used to hit the given tier of emote.  
    \nid stringID of the emote tier. Possible tiers are: 1,100,500,1000,5000, 10k, or 100k.
    colorstringHex code for the color associated with the bits of that tier. Grey, Purple, Teal, Blue, or Red color to match the base bit type.
    imagesobjectStructure containing both animated and static image sets, sorted by light and dark.
    can_cheerBooleanIndicates whether or not emote information is accessible to users.
    show_in_bits_cardBooleanIndicates whether or not we hide the emote from the bits card.
    typestringShows whether the emote is global_first_party,  global_third_party, channel_custom, display_only, or sponsored.
    orderintegerOrder of the emotes as shown in the bits card, in ascending order.
    last_updatedstringThe data when this Cheermote was last updated.
    is_charitableBooleanIndicates whether or not this emote provides a charity contribution match during charity campaigns.
    \n\n \n
    \n\n \n
    \n \n

    Example Requests

    \n\n

    This request lists all global Cheermotes.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/bits/cheermotes' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    This request lists all global Cheermotes and any Cheermote uploaded by this broadcaster.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/bits/cheermotes?broadcaster_id=41245072' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"prefix\": \"Cheer\",\n      \"tiers\": [\n        {\n          \"min_bits\": 1,\n          \"id\": \"1\",\n          \"color\": \"#979797\",\n          \"images\": {\n            \"dark\": {\n              \"animated\": {\n                \"1\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/animated/1/1.gif\",\n                \"1.5\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/animated/1/1.5.gif\",\n                \"2\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/animated/1/2.gif\",\n                \"3\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/animated/1/3.gif\",\n                \"4\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/animated/1/4.gif\"\n              },\n              \"static\": {\n                \"1\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/static/1/1.png\",\n                \"1.5\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/static/1/1.5.png\",\n                \"2\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/static/1/2.png\",\n                \"3\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/static/1/3.png\",\n                \"4\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/dark/static/1/4.png\"\n              }\n            },\n            \"light\": {\n              \"animated\": {\n                \"1\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/animated/1/1.gif\",\n                \"1.5\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/animated/1/1.5.gif\",\n                \"2\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/animated/1/2.gif\",\n                \"3\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/animated/1/3.gif\",\n                \"4\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/animated/1/4.gif\"\n              },\n              \"static\": {\n                \"1\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/static/1/1.png\",\n                \"1.5\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/static/1/1.5.png\",\n                \"2\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/static/1/2.png\",\n                \"3\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/static/1/3.png\",\n                \"4\": \"https://d3aqoihi2n8ty8.cloudfront.net/actions/cheer/light/static/1/4.png\"\n              }\n            }\n          },\n          \"can_cheer\": true,\n          \"show_in_bits_card\": true\n        }\n        ...\n      ],\n      \"type\": \"global_first_party\",\n      \"order\": 1,\n      \"last_updated\": \"2018-05-22T00:06:04Z\",\n      \"is_charitable\": false\n    },\n    ...\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Extension Transactions

    \n \n \n

    Get Extension Transactions allows extension back end servers to fetch a list of transactions that have occurred for their extension across all of Twitch. A transaction is a record of a user exchanging Bits for an in-Extension digital good.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/extensions/transactions

    \n\n

    Description

    \n\n

    Gets the list of Extension Transactions for a given extension.

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required.

    \n\n

    Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterRequiredTypeDescription
    extension_idYesstringID of the extension to list transactions for. Maximum: 1
    idNostringTransaction IDs to look up. Can include multiple to fetch multiple transactions in a single request.

    Format: Repeated Query Parameter, eg. /helix/extensions/transactions?extension_id=1234&id=1&id=2&id=3

    Maximum: 100
    afterNostringThe cursor used to fetch the next page of data. This only applies to queries without ID. If an ID is specified, it supersedes the cursor.
    firstNointegerMaximum number of objects to return.

    Maximum: 100
    Default: 20
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    paginationobject containing a stringIf provided, is the key used to fetch the next page of data. If not provided, the current response is the last page of data available.
    dataarrayArray of requested transactions.
    idstringUnique identifier of the Bits in Extensions Transaction.
    timestampstringUTC timestamp when this transaction occurred.
    broadcaster_idstringTwitch User ID of the channel the transaction occurred on.
    broadcaster_loginstringLogin name of the broadcaster.
    broadcaster_namestringTwitch Display Name of the broadcaster.
    user_idstringTwitch User ID of the user who generated the transaction.
    user_loginstringLogin name of the user who generated the transaction.
    user_namestringTwitch Display Name of the user who generated the transaction.
    product_typestringEnum of the product type. Currently only BITS_IN_EXTENSION.
    product_dataobjectJSON Object representing the product acquired, as it looked at the time of the transaction.
    domainstringSet this field to twitch.ext + your extension ID.
    broadcastBooleanFlag that denotes whether or not the data was sent over the extension pubsub to all instances of the extension.
    expirationstringAlways empty since only unexpired products can be purchased.
    skustringUnique identifier for the product across the extension.
    costobjectJSON Object representing the cost to acquire the product.
    amountintegerNumber of Bits required to acquire the product.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    type`enumAlways the string
    “Bits”.  
    displayNamestringDisplay Name of the product.
    inDevelopmentBooleanFlag used to indicate if the product is in development. Either true or false.
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X GET\n'https://api.twitch.tv/helix/extensions/transactions?extension_id=1234' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n     \"data\": [\n          {\n               \"id\": \"74c52265-e214-48a6-91b9-23b6014e8041\",\n               \"timestamp\": \"2019-01-28T04:15:53.325Z\",\n               \"broadcaster_id\": \"439964613\",\n               \"broadcaster_login\": \"chikuseuma\",\n               \"broadcaster_name\": \"chikuseuma\",\n               \"user_id\": \"424596340\",\n               \"user_login\": \"quotrok\",\n               \"user_name\": \"quotrok\",\n               \"product_type\": \"BITS_IN_EXTENSION\",\n               \"product_data\": {\n                     \"sku\": \"testSku100\",\n                     \"cost\": {\n                          \"amount\": 100,\n                          \"type\": \"bits\"\n                     },\n                     \"displayName\": \"Test Sku\",\n                     \"inDevelopment\": false\n                }\n           },\n           {\n                \"id\": \"8d303dc6-a460-4945-9f48-59c31d6735cb\",\n                \"timestamp\": \"2019-01-18T09:10:13.397Z\",\n                \"broadcaster_id\": \"439964613\",\n                \"broadcaster_login\": \"chikuseuma\",\n                \"broadcaster_name\": \"chikuseuma\"\n                \"user_id\": \"439966926\",\n                \"user_login\": \"liscuit\",\n                \"user_name\": \"liscuit\",\n                \"product_type\": \"BITS_IN_EXTENSION\",\n                \"product_data\": {\n                     \"sku\": \"testSku100\",\n                     \"cost\": {\n                          \"amount\": 100,\n                          \"type\": \"bits\"\n                     },\n                     \"displayName\": \"Test Sku\",\n                     \"inDevelopment\": false\n                }\n          },\n          ...\n     ],\n     \"pagination\": {\n          \"cursor\": \"cursorString\"\n     }\n}\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Channel Information

    \n \n \n

    Gets channel information for users.

    \n\n

    Authentication

    \n\n

    Valid user token or app access token.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/channels

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID of the channel to be updated
    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringTwitch User ID of this channel owner
    broadcaster_namestringTwitch user display name of this channel owner
    game_namestringName of the game being played on the channel
    game_idstringCurrent game ID being played on the channel
    broadcaster_languagestringLanguage of the channel. A language value is either the ISO 639-1 two-letter code for a supported stream language or “other”.
    titlestringTitle of the stream
    delayintegerStream delay in seconds
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200Channel/Stream returned successfully
    400Missing Query Parameter
    500Internal Server Error; Failed to get channel information
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request gets information about the TwitchDev channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channels?broadcaster_id=141981764' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_id\": \"141981764\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_language\": \"en\",\n      \"game_id\": \"509670\",\n      \"game_name\": \"Science & Technology\",\n      \"title\": \"TwitchDev Monthly Update // May 6, 2021\",\n      \"delay\": 0\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Modify Channel Information

    \n \n \n

    Modifies channel information for users.

    \n\n

    Authentication

    \n\n
      \n
    • \n

      OAuth Token required

      \n
    • \n
    • \n

      Required scope: channel:manage:broadcast

      \n
    • \n
    \n\n

    URL

    \n\n

    PATCH https://api.twitch.tv/helix/channels

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID of the channel to be updated
    \n\n

    Body Parameters

    \n\n

    All parameters are optional, but at least one parameter must be provided.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    game_idstringThe current game ID being played on the channel. Use “0” or “” (an empty string) to unset the game.
    broadcaster_languagestringThe language of the channel. A language value must be either the ISO 639-1 two-letter code for a supported stream language or “other”.
    titlestringThe title of the stream. Value must not be an empty string.
    delayintegerStream delay in seconds. Stream delay is a Twitch Partner feature; trying to set this value for other account types will return a 400 error.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    204Channel/Stream updated successfully
    400Missing or invalid parameter
    500Internal server error; failed to update channel
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X PATCH 'https://api.twitch.tv/helix/channels?broadcaster_id=41245072' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{\"game_id\":\"33214\", \"title\":\"there are helicopters in the game? REASON TO PLAY FORTNITE found\", \"broadcaster_language\":\"en\"}'\n
    \n\n

    Example Response

    \n\n
    204 No Content\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Channel Editors

    \n \n \n

    Gets a list of users who have editor permissions for a specific channel.

    \n

    Authentication

    \n\n
      \n
    • OAuth user token required
    • \n
    • Required scope: channel:read:editors\n
    • \n
    \n\n

    URL

    \n

    GET https://api.twitch.tv/helix/channels/editors

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringBroadcaster’s user ID associated with the channel.
    \n\n

    Optional Query Parameters

    \n\n

    None.

    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    user_idstringUser ID of the editor.
    user_namestringDisplay name of the editor.
    created_atstringDate and time the editor was given editor permissions.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200A list of channel editors is returned.
    400Query parameter is missing.
    401Authorization is missing or there was an OAuth token mismatch.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example gets a list of editors for the TwitchDev channel which has a User ID of 141981764.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channels/editors?broadcaster_id=141981764' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"user_id\": \"182891647\",\n      \"user_name\": \"mauerbac\",\n      \"created_at\": \"2019-02-15T21:19:50.380833Z\"\n    },\n    {\n      \"user_id\": \"135093069\",\n      \"user_name\": \"BlueLava\",\n      \"created_at\": \"2018-03-07T16:28:29.872937Z\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create Custom Rewards

    \n \n \n

    Creates a Custom Reward on a channel.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:redemptions\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/channel_points/custom_rewards

    \n\n

    Pagination

    \n\n

    None.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the user OAuth token.
    \n\n

    Required Body Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    titlestringThe title of the reward.
    costintegerThe cost of the reward.
    \n\n

    Optional Body Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    promptstringThe prompt for the viewer when redeeming the reward.
    is_enabledbooleanIs the reward currently enabled, if false the reward won’t show up to viewers. Default: true
    background_colorstringCustom background color for the reward. Format: Hex with # prefix. Example: #00E5CB.
    is_user_input_requiredbooleanDoes the user need to enter information when redeeming the reward. Default: false.
    is_max_per_stream_enabledbooleanWhether a maximum per stream is enabled. Default: false.
    max_per_streamintegerThe maximum number per stream if enabled. Required when any value of is_max_per_stream_enabled is included.
    is_max_per_user_per_stream_enabledbooleanWhether a maximum per user per stream is enabled. Default: false.
    max_per_user_per_streamintegerThe maximum number per user per stream if enabled. Required when any value of is_max_per_user_per_stream_enabled is included.
    is_global_cooldown_enabledbooleanWhether a cooldown is enabled. Default: false.
    global_cooldown_secondsintegerThe cooldown in seconds if enabled. Required when any value of is_global_cooldown_enabled is included.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to FULFILLED status immediately when redeemed and skip the request queue instead of the normal UNFULFILLED status. Default: false.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID of the channel the reward is for.
    broadcaster_loginstringBroadcaster’s user login name.
    broadcaster_namestringDisplay name of the channel the reward is for.
    idstringID of the reward.
    titlestringThe title of the reward.
    promptstringThe prompt for the viewer when they are redeeming the reward.
    costintegerThe cost of the reward.
    imageobjectSet of custom images of 1x, 2x and 4x sizes for the reward { url_1x: string, url_2x: string, url_4x: string }, can be null if no images have been uploaded
    default_imageobjectSet of default images of 1x, 2x and 4x sizes for the reward { url_1x: string, url_2x: string, url_4x: string }
    background_colorstringCustom background color for the reward. Format: Hex with # prefix. Example: #00E5CB.
    is_enabledbooleanIs the reward currently enabled, if false the reward won’t show up to viewers
    is_user_input_requiredbooleanDoes the user need to enter information when redeeming the reward
    max_per_stream_settingobjectWhether a maximum per stream is enabled and what the maximum is. { is_enabled: bool, max_per_stream: int }
    max_per_user_per_stream_settingobjectWhether a maximum per user per stream is enabled and what the maximum is. { is_enabled: bool, max_per_user_per_stream: int }
    global_cooldown_settingobjectWhether a cooldown is enabled and what the cooldown is. { is_enabled: bool, global_cooldown_seconds: int }
    is_pausedbooleanIs the reward currently paused, if true viewers can’t redeem
    is_in_stockbooleanIs the reward currently in stock, if false viewers can’t redeem
    should_redemptions_skip_request_queuebooleanShould redemptions be set to FULFILLED status immediately when redeemed and skip the request queue instead of the normal UNFULFILLED status.
    redemptions_redeemed_current_streamintegerThe number of redemptions redeemed during the current live stream. Counts against the max_per_stream_setting limit. Null if the broadcasters stream isn’t live or max_per_stream_setting isn’t enabled.
    cooldown_expires_atstringTimestamp of the cooldown expiration. Null if the reward isn’t on cooldown.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200OK: A list of the Custom Rewards is returned
    400Bad Request: Query Parameter missing or invalid
    401Unauthenticated: Missing/invalid Token
    403Forbidden: Channel Points are not available for the broadcaster
    500Internal Server Error: Something bad happened on our side
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request creates a custom reward:

    \n\n
    \ncurl -X POST 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212' \\\n-H 'client-id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n    \"title\":\"game analysis 1v1\",\n    \"cost\":50000\n}'\n
    \n\n

    Example Response

    \n\n
     {\n     \"data\": [\n         {\n             \"broadcaster_name\": \"torpedo09\",\n             \"broadcaster_login\": \"torpedo09\",\n             \"broadcaster_id\": \"274637212\",\n             \"id\": \"afaa7e34-6b17-49f0-a19a-d1e76eaaf673\",\n             \"image\": null,\n             \"background_color\": \"#00E5CB\",\n             \"is_enabled\": true,\n             \"cost\": 50000,\n             \"title\": \"game analysis 1v1\",\n             \"prompt\": \"\",\n             \"is_user_input_required\": false,\n             \"max_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_stream\": 0\n             },\n             \"max_per_user_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_user_per_stream\": 0\n             },\n             \"global_cooldown_setting\": {\n                 \"is_enabled\": false,\n                 \"global_cooldown_seconds\": 0\n             },\n             \"is_paused\": false,\n             \"is_in_stock\": true,\n             \"default_image\": {\n                 \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n                 \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n                 \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n             },\n             \"should_redemptions_skip_request_queue\": false,\n             \"redemptions_redeemed_current_stream\": null,\n             \"cooldown_expires_at\": null\n         }\n     ]\n }\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Delete Custom Reward

    \n \n \n

    Deletes a Custom Reward on a channel.

    \n\n

    The Custom Reward specified by id must have been created by the client_id attached to the OAuth token in order to be deleted. Any UNFULFILLED Custom Reward Redemptions of the deleted Custom Reward will be updated to the FULFILLED status.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:redemptions\n
    • \n
    \n\n

    URL

    \n\n

    DELETE https://api.twitch.tv/helix/channel_points/custom_rewards

    \n\n

    Pagination

    \n\n

    None.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the user OAuth token.
    idstringID of the Custom Reward to delete, must match a Custom Reward on broadcaster_id’s channel.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    204No Content
    400Bad Request: Query/Body Parameter missing or invalid
    401Unauthenticated: Missing/invalid Token
    403Forbidden: The Custom Reward was created by a different client_id or Channel Points are not available for the broadcaster
    404Not Found: The Custom Reward doesn’t exist with the id and broadcaster_id specified
    500Internal Server Error: Something bad happened on our side
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request deletes a custom reward:

    \n\n
    curl -X DELETE 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212&id=b045196d-9ce7-4a27-a9b9-279ed341ab28' \\\n-H 'Client-Id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2'\n
    \n\n

    Example Response

    \n\n
    204 No Content\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Custom Reward

    \n \n \n

    Returns a list of Custom Reward objects for the Custom Rewards on a channel.

    \n\n

    Authentication

    \n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:read:redemptions\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/channel_points/custom_rewards

    \n\n

    Pagination

    \n\n

    None.

    \n\n

    There is a limit of 50 Custom Rewards on a channel at a time. This includes both enabled and disabled Custom Rewards.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the user OAuth token.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringWhen used, this parameter filters the results and only returns reward objects for the Custom Rewards with matching ID. Maximum: 50
    only_manageable_rewardsBooleanWhen set to true, only returns custom rewards that the calling client_id can manage. Default: false.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID of the channel the reward is for.
    broadcaster_loginstringLogin of the channel the reward is for.
    broadcaster_namestringDisplay name of the channel the reward is for.
    idstringID of the reward.
    titlestringThe title of the reward.
    promptstringThe prompt for the viewer when redeeming the reward.
    costintegerThe cost of the reward.
    imageobjectSet of custom images of 1x, 2x and 4x sizes for the reward { url_1x: string, url_2x: string, url_4x: string }, can be null if no images have been uploaded.
    default_imageobjectSet of default images of 1x, 2x and 4x sizes for the reward { url_1x: string, url_2x: string, url_4x: string }
    background_colorstringCustom background color for the reward. Format: Hex with # prefix. Example: #00E5CB.
    is_enabledbooleanIs the reward currently enabled, if false the reward won’t show up to viewers.
    is_user_input_requiredbooleanDoes the user need to enter information when redeeming the reward
    max_per_stream_settingobjectWhether a maximum per stream is enabled and what the maximum is. { is_enabled: bool, max_per_stream: int }
    max_per_user_per_stream_settingobjectWhether a maximum per user per stream is enabled and what the maximum is. { is_enabled: bool, max_per_user_per_stream: int }
    global_cooldown_settingobjectWhether a cooldown is enabled and what the cooldown is. { is_enabled: bool, global_cooldown_seconds: int }
    is_pausedbooleanIs the reward currently paused, if true viewers can’t redeem.
    is_in_stockbooleanIs the reward currently in stock, if false viewers can’t redeem.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to FULFILLED status immediately when redeemed and skip the request queue instead of the normal UNFULFILLED status.
    redemptions_redeemed_current_streamintegerThe number of redemptions redeemed during the current live stream. Counts against the max_per_stream_setting limit. Null if the broadcasters stream isn’t live or max_per_stream_setting isn’t enabled.
    cooldown_expires_atstringTimestamp of the cooldown expiration. Null if the reward isn’t on cooldown.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200OK: A list of the Custom Rewards is returned
    400Bad Request: Query Parameter missing or invalid
    401Unauthenticated: Missing/invalid Token
    403Forbidden: Channel Points are not available for the broadcaster
    404Not Found: No Custom Rewards with the specified IDs were found
    500Internal Server Error: Something bad happened on our side
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This request lists custom rewards:

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212'\n-H 'Client-Id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2'\n
    \n\n

    Example Response #1

    \n\n
    {\n     \"data\": [\n         {\n             \"broadcaster_name\": \"torpedo09\",\n             \"broadcaster_login\": \"torpedo09\",\n             \"broadcaster_id\": \"274637212\",\n             \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n             \"image\": null,\n             \"background_color\": \"#00E5CB\",\n             \"is_enabled\": true,\n             \"cost\": 50000,\n             \"title\": \"game analysis\",\n             \"prompt\": \"\",\n             \"is_user_input_required\": false,\n             \"max_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_stream\": 0\n             },\n             \"max_per_user_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_user_per_stream\": 0\n             },\n             \"global_cooldown_setting\": {\n                 \"is_enabled\": false,\n                 \"global_cooldown_seconds\": 0\n             },\n             \"is_paused\": false,\n             \"is_in_stock\": true,\n             \"default_image\": {\n                 \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n                 \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n                 \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n             },\n             \"should_redemptions_skip_request_queue\": false,\n             \"redemptions_redeemed_current_stream\": null,\n             \"cooldown_expires_at\": null\n         }\n     ]\n }\n
    \n\n

    Example Request #2

    \n\n

    This request lists custom rewards that the calling Client ID can manage:

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212&only_manageable_rewards=true'\n-H 'Client-Id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2'​​​​​​​\n
    \n\n

    Example Response #2

    \n\n
    {\n     \"data\": [\n         {\n             \"broadcaster_name\": \"torpedo09\",\n             \"broadcaster_id\": \"274637212\",\n             \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n             \"image\": null,\n             \"background_color\": \"#00E5CB\",\n             \"is_enabled\": true,\n             \"cost\": 50000,\n             \"title\": \"game analysis\",\n             \"prompt\": \"\",\n             \"is_user_input_required\": false,\n             \"max_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_stream\": 0\n             },\n             \"max_per_user_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_user_per_stream\": 0\n             },\n             \"global_cooldown_setting\": {\n                 \"is_enabled\": false,\n                 \"global_cooldown_seconds\": 0\n             },\n             \"is_paused\": false,\n             \"is_in_stock\": true,\n             \"default_image\": {\n                 \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n                 \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n                 \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n             },\n             \"should_redemptions_skip_request_queue\": false,\n             \"redemptions_redeemed_current_stream\": null,\n             \"cooldown_expires_at\": null\n         }\n     ]\n }\n
    \n\n

    Example Request #3

    \n\n

    This request bulk-gets custom rewards.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212&id=92af127c-7326-4483-a52b-b0da0be61c01'\n-H 'Client-Id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2'​​​​​​​​​​​​​​\n
    \n\n

    Example Response #3

    \n\n
    {\n     \"data\": [\n         {\n             \"broadcaster_name\": \"torpedo09\",\n             \"broadcaster_id\": \"274637212\",\n             \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n             \"image\": null,\n             \"background_color\": \"#00E5CB\",\n             \"is_enabled\": true,\n             \"cost\": 50000,\n             \"title\": \"game analysis\",\n             \"prompt\": \"\",\n             \"is_user_input_required\": false,\n             \"max_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_stream\": 0\n             },\n             \"max_per_user_per_stream_setting\": {\n                 \"is_enabled\": false,\n                 \"max_per_user_per_stream\": 0\n             },\n             \"global_cooldown_setting\": {\n                 \"is_enabled\": false,\n                 \"global_cooldown_seconds\": 0\n             },\n             \"is_paused\": false,\n             \"is_in_stock\": true,\n             \"default_image\": {\n                 \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n                 \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n                 \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n             },\n             \"should_redemptions_skip_request_queue\": false,\n             \"redemptions_redeemed_current_stream\": null,\n             \"cooldown_expires_at\": null\n         }\n     ]\n }\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Custom Reward Redemption

    \n \n \n

    Returns Custom Reward Redemption objects for a Custom Reward on a channel that was created by the same client_id.

    \n\n

    Developers only have access to get and update redemptions for the rewards created programmatically by the same client_id.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:read:redemptions\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/channel_points/custom_rewards/redemptions

    \n\n

    Pagination

    \n\n

    Maximum of 50 per page. Returns oldest first.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the user OAuth token.
    reward_idstringWhen ID is not provided, this parameter returns paginated Custom Reward Redemption objects for redemptions of the Custom Reward with ID reward_id.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringWhen used, this param filters the results and only returns Custom Reward Redemption objects for the redemptions with matching ID. Maximum: 50
    statusstringWhen id is not provided, this param is required and filters the paginated Custom Reward Redemption objects for redemptions with the matching status. Can be one of UNFULFILLED, FULFILLED or CANCELED
    sortstringSort order of redemptions returned when getting the paginated Custom Reward Redemption objects for a reward. One of: OLDEST, NEWEST. Default: OLDEST.
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. This applies only to queries without ID. If an ID is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    firstintegerNumber of results to be returned when getting the paginated Custom Reward Redemption objects for a reward. Limit: 50. Default: 20.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe id of the broadcaster that the reward belongs to.
    broadcaster_loginstringBroadcaster’s user login name.
    broadcaster_namestringThe display name of the broadcaster that the reward belongs to.
    idstringThe ID of the redemption.
    user_loginstringThe login of the user who redeemed the reward.
    user_idstringThe ID of the user that redeemed the reward.
    user_namestringThe display name of the user that redeemed the reward.
    rewardobjectBasic information about the Custom Reward that was redeemed at the time it was redeemed. { “id”: string, “title”: string, “prompt”: string, “cost”: int, }
    user_inputstringThe user input provided. Empty string if not provided.
    statusstringOne of UNFULFILLED, FULFILLED or CANCELED
    redeemed_atstringRFC3339 timestamp of when the reward was redeemed.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200Ok: A list of the Custom Reward Redemptions is returned
    400Bad Request: Query Parameter missing or invalid
    401Unauthenticated: Missing/invalid Token
    403Forbidden: The Custom Reward was created by a different client_id or Channel Points are not available for the broadcaster
    404Not Found: No Custom Reward Redemptions with the specified ids were found
    500Internal Server Error: Something bad happened on our side
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This example lists custom reward redemptions for a specific reward:

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channel_points/custom_rewards/redemptions?broadcaster_id=274637212&reward_id=92af127c-7326-4483-a52b-b0da0be61c01&status=CANCELED' \\\n-H 'Client-Id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2'\n
    \n\n

    Example Response #1

    \n\n
     {\n    \"data\": [\n          {\n            \"broadcaster_name\": \"torpedo09\",\n            \"broadcaster_login\": \"torpedo09\",\n            \"broadcaster_id\": \"274637212\",\n            \"id\": \"17fa2df1-ad76-4804-bfa5-a40ef63efe63\",\n            \"user_login\": \"torpedo09\",\n            \"user_id\": \"274637212\",\n            \"user_name\": \"torpedo09\",\n            \"user_input\": \"\",\n            \"status\": \"CANCELED\",\n            \"redeemed_at\": \"2020-07-01T18:37:32Z\",\n            \"reward\": {\n                \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n                \"title\": \"game analysis\",\n                \"prompt\": \"\",\n                \"cost\": 50000\n                  }\n        }\n    ],\n    \"pagination\": {\n        \"cursor\":      \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6Ik1UZG1ZVEprWmpFdFlXUTNOaTAwT0RBMExXSm1ZVFV0WVRRd1pXWTJNMlZtWlRZelgxOHlNREl3TFRBM0xUQXhWREU0T2pNM09qTXlMakl6TXpFeU56RTFOMW89In19\"\n    }\n}\n
    \n\n

    Example Request #2

    \n\n

    This example gets custom reward redemptions by ID.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/channel_points/custom_rewards/redemptions?broadcaster_id=274637212&reward_id=92af127c-7326-4483-a52b-b0da0be61c01&id=17fa2df1-ad76-4804-bfa5-a40ef63efe63' \\\n-H 'Client-Id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2'\n
    \n\n

    Example Response #2

    \n\n
    {\n    \"data\": [\n              {\n            \"broadcaster_name\": \"torpedo09\",\n            \"broadcaster_login\": \"torpedo09\",\n            \"broadcaster_id\": \"274637212\",\n            \"id\": \"17fa2df1-ad76-4804-bfa5-a40ef63efe63\",\n            \"user_id\": \"274637212\",\n            \"user_name\": \"torpedo09\",\n            \"user_input\": \"\",\n            \"status\": \"CANCELED\",\n            \"redeemed_at\": \"2020-07-01T18:37:32Z\",\n            \"reward\": {\n                \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n                \"title\": \"game analysis\",\n                \"prompt\": \"\",\n                \"cost\": 50000\n            }\n        }\n    ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Update Custom Reward

    \n \n \n

    Updates a Custom Reward created on a channel.

    \n\n

    The Custom Reward specified by id must have been created by the client_id attached to the user OAuth token.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:redemptions\n
    • \n
    \n\n

    URL

    \n\n

    PATCH https://api.twitch.tv/helix/channel_points/custom_rewards

    \n\n

    Pagination

    \n\n

    None.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the user OAuth token.
    idstringID of the Custom Reward to update. Must match a Custom Reward on the channel of the broadcaster_id.
    \n\n

    Optional Body Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    titlestringThe title of the reward.
    promptstringThe prompt for the viewer when they are redeeming the reward.
    costintegerThe cost of the reward.
    background_colorstringCustom background color for the reward as a hexadecimal value. Example: #00E5CB.
    is_enabledbooleanIs the reward currently enabled, if false the reward won’t show up to viewers.
    is_user_input_requiredbooleanDoes the user need to enter information when redeeming the reward.
    is_max_per_stream_enabledbooleanWhether a maximum per stream is enabled. Required when any value of max_per_stream is included.
    max_per_streamintegerThe maximum number per stream if enabled. Required when any value of is_max_per_stream_enabled is included.
    is_max_per_user_per_stream_enabledbooleanWhether a maximum per user per stream is enabled. Required when any value of max_per_user_per_stream is included.
    max_per_user_per_streamintegerThe maximum number per user per stream if enabled. Required when any value of is_max_per_user_per_stream_enabled is included.
    is_global_cooldown_enabledbooleanWhether a cooldown is enabled. Required when any value of global_cooldown_seconds is included.
    global_cooldown_secondsintegerThe cooldown in seconds if enabled. Required when any value of is_global_cooldown_enabled is included.
    is_pausedbooleanIs the reward currently paused, if true viewers cannot redeem.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to FULFILLED status immediately when redeemed and skip the request queue instead of the normal UNFULFILLED status.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringID of the channel the reward is for.
    broadcaster_loginstringBroadcaster’s user login name.
    broadcaster_namestringDisplay name of the channel the reward is for.
    idstringID of the reward.
    titlestringThe title of the reward.
    promptstringThe prompt for the viewer when they are redeeming the reward.
    costintegerThe cost of the reward.
    imageobjectSet of custom images of 1x, 2x, and 4x sizes for the reward, can be null if no images have been uploaded.
    default_imageobjectSet of default images of 1x, 2x, and 4x sizes for the reward.
    background_colorstringCustom background color for the reward as a hexadecimal value. Example: #00E5CB.
    is_enabledbooleanIs the reward currently enabled, if false the reward won’t show up to viewers.
    is_user_input_requiredbooleanDoes the user need to enter information when redeeming the reward.
    max_per_stream_settingobjectWhether a maximum per stream is enabled and what the maximum is.
    max_per_user_per_stream_settingobjectWhether a maximum per user per stream is enabled and what the maximum is.
    global_cooldown_settingobjectWhether a cooldown is enabled and what the cooldown is.
    is_pausedbooleanIs the reward currently paused, if true viewers cannot redeem.
    is_in_stockbooleanIs the reward currently in stock, if false viewers can’t redeem.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to FULFILLED status immediately when redeemed and skip the request queue instead of the normal UNFULFILLED status.
    redemptions_redeemed_current_streamintegerThe number of redemptions redeemed during the current live stream. Counts against the max_per_stream_setting limit. null if the broadcasters stream is not live or max_per_stream_setting is not enabled.
    cooldown_expires_atstringTimestamp of the cooldown expiration. null if the reward is not on cooldown.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200OK: A list of the Custom Rewards is returned.
    400Bad Request: Query Parameter missing or invalid. This includes the required parameter pairs to set max per stream, max per user per stream, and global cooldown.
    401Unauthenticated: Missing/invalid Token.
    403Forbidden: The Custom Reward was created by a different client_id or Channel Points are not available for the broadcaster.
    404Not Found: The Custom Reward does not exist with the id and broadcaster_id specified.
    500Internal Server Error: Could not update the Custom Reward.
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This request disables a custom reward:

    \n\n
    \ncurl -X PATCH 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212&id=92af127c-7326-4483-a52b-b0da0be61c01' \\\n-H 'client-id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n              \"is_enabled\": false\n }'\n
    \n\n

    Example Response #1

    \n\n
    {\n    \"data\": [\n        {\n            \"broadcaster_name\": \"torpedo09\",\n            \"broadcaster_login\": \"torpedo09\",\n            \"broadcaster_id\": \"274637212\",\n            \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n            \"image\": null,\n            \"background_color\": \"#00E5CB\",\n            \"is_enabled\": false,\n            \"cost\": 30000,\n            \"title\": \"game analysis 2v2\",\n            \"prompt\": \"\",\n            \"is_user_input_required\": false,\n            \"max_per_stream_setting\": {\n                \"is_enabled\": true,\n                \"max_per_stream\": 60\n            },\n            \"max_per_user_per_stream_setting\": {\n                \"is_enabled\": false,\n                \"max_per_user_per_stream\": 0\n            },\n            \"global_cooldown_setting\": {\n                \"is_enabled\": false,\n                \"global_cooldown_seconds\": 0\n            },\n            \"is_paused\": false,\n            \"is_in_stock\": false,\n            \"default_image\": {\n                \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n                \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n                \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n            },\n            \"should_redemptions_skip_request_queue\": true,\n            \"redemptions_redeemed_current_stream\": 60,\n            \"cooldown_expires_at\": null\n        }\n    ]\n}\n
    \n\n

    Example Request #2

    \n\n
    curl -X PATCH 'https://api.twitch.tv/helix/channel_points/custom_rewards?broadcaster_id=274637212&id=92af127c-7326-4483-a52b-b0da0be61c01' \\\n-H 'client-id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n             \"title\": \"game analysis 2v2\"\n }'\n
    \n\n

    Example Response #2

    \n\n
     {\n    \"data\": [\n        {\n            \"broadcaster_name\": \"torpedo09\",\n            \"broadcaster_login\": \"torpedo09\",\n            \"broadcaster_id\": \"274637212\",\n            \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n            \"image\": null,\n            \"background_color\": \"\",\n            \"is_enabled\": false,\n            \"cost\": 30000,\n            \"title\": \"game analysis 2v2\",\n            \"prompt\": \"\",\n            \"is_user_input_required\": false,\n            \"max_per_stream_setting\": {\n                \"is_enabled\": true,\n                \"max_per_stream\": 60\n            },\n            \"max_per_user_per_stream_setting\": {\n                \"is_enabled\": false,\n                \"max_per_user_per_stream\": 0\n            },\n            \"global_cooldown_setting\": {\n                \"is_enabled\": false,\n                \"global_cooldown_seconds\": 0\n            },\n            \"is_paused\": false,\n            \"is_in_stock\": true,\n            \"default_image\": {\n                \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n                \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n                \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n            },\n            \"should_redemptions_skip_request_queue\": true,\n            \"redemptions_redeemed_current_stream\": 60,\n            \"cooldown_expires_at\": null\n        }\n    ]\n  }\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Update Redemption Status

    \n \n \n

    Updates the status of Custom Reward Redemption objects on a channel that are in the UNFULFILLED status.

    \n\n

    The Custom Reward Redemption specified by id must be for a Custom Reward created by the client_id attached to the user OAuth token.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:redemptions\n
    • \n
    \n\n

    URL

    \n\n

    PATCH https://api.twitch.tv/helix/channel_points/custom_rewards/redemptions

    \n\n

    Pagination

    \n\n

    None.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the Custom Reward Redemption to update, must match a Custom Reward Redemption on broadcaster_id’s channel. Maximum: 50.
    broadcaster_idstringProvided broadcaster_id must match the user_id in the user OAuth token.
    reward_idstringID of the Custom Reward the redemptions to be updated are for.
    \n\n

    Required Body Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    statusstringThe new status to set redemptions to. Can be either FULFILLED or CANCELED. Updating to CANCELED will refund the user their Channel Points.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe ID of the broadcaster that the reward belongs to.
    broadcaster_loginstringBroadcaster’s user login name.
    broadcaster_namestringThe display name of the broadcaster that the reward belongs to.
    idstringThe ID of the redemption.
    user_idstringThe ID of the user that redeemed the reward.
    user_namestringThe display name of the user that redeemed the reward.
    user_loginstringThe login of the user that redeemed the reward.
    rewardobjectBasic information about the Custom Reward that was redeemed at the time it was redeemed. { “id”: string, “title”: string, “prompt”: string, “cost”: int, }
    user_inputstringThe user input provided. Null if not provided.
    statusstringOne of UNFULFILLED, FULFILLED or CANCELED.
    redeemed_atstringRFC3339 timestamp of when the reward was redeemed.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200OK: A list of the updated Custom Reward Redemptions is returned
    400Bad Request: Query Parameter missing or invalid
    401Unauthenticated: Missing/invalid Token
    403Forbidden: The Custom Reward was created by a different client_id or Channel Points are not available for the broadcaster
    404Not Found: No Custom Reward Redemptions with the specified IDs were found with a status of UNFULFILLED.
    500Internal Server Error: Something bad happened on our side
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request updates custom reward redemption status.

    \n\n
    curl --X PATCH 'https://api.twitch.tv/helix/channel_points/custom_rewards/redemptions?broadcaster_id=274637212&reward_id=92af127c-7326-4483-a52b-b0da0be61c01&id=17fa2df1-ad76-4804-bfa5-a40ef63efe63' \\\n-H 'client-id: gx2pv4208cff0ig9ou7nk3riccffxt' \\\n-H 'Authorization: Bearer vjxv3i0l4zxru966wsnwji51tmpkj2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n    \"status\":\"CANCELED\"\n}'\n
    \n\n

    Example Response

    \n\n
    {\n    \"data\": [\n        {\n            \"broadcaster_name\": \"torpedo09\",\n            \"broadcaster_login\": \"torpedo09\",\n            \"broadcaster_id\": \"274637212\",\n            \"id\": \"17fa2df1-ad76-4804-bfa5-a40ef63efe63\",\n            \"user_id\": \"274637212\",\n            \"user_name\": \"torpedo09\",\n            \"user_login\": \"torpedo09\",\n            \"user_input\": \"\",\n            \"status\": \"CANCELED\",\n            \"redeemed_at\": \"2020-07-01T18:37:32Z\",\n            \"reward\": {\n                \"id\": \"92af127c-7326-4483-a52b-b0da0be61c01\",\n                \"title\": \"game analysis\",\n                \"prompt\": \"\",\n                \"cost\": 50000\n            }\n        }\n    ]\n}\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Channel Emotes

    \n \n \n

    NEW Gets all custom emotes for a specific Twitch channel including subscriber emotes, Bits tier emotes, and follower emotes. Custom channel emotes are custom emoticons that viewers may use in Twitch chat once they are subscribed to, cheered in, or followed the channel that owns the emotes.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/chat/emotes

    \n\n

    Pagination Support

    \n\n

    None.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster whose emotes are being requested.

    Maximum: 1
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the emote.
    namestringName of the emote a viewer types into Twitch chat for the image to appear.
    imagesobjectObject of image URLs for the emote.
    images.url_1xstringSmall emote image URL.
    images.url_2xstringMedium emote image URL.
    images.url_4xstringLarge emote image URL.
    tierstringIf the emote_type is \"subscriptions\", this indicates the subscriber tier at which the emote is unlocked. Set to an empty string otherwise.
    emote_typestringThe type of emote. The most common values for custom channel emotes are:

    subscriptions: Indicates a custom subscriber emote.

    bitstier: Indicates a custom Bits tier emote.

    follower: Indicates a custom follower emote.
    emote_set_idstringID of the emote set the emote belongs to.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Custom channel emotes returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns custom emotes for the TwitchDev channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/chat/emotes?broadcaster_id=141981764' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"304456832\",\n      \"name\": \"twitchdevPitchfork\",\n      \"images\": {\n          \"url_1x\": \"https://static-cdn.jtvnw.net/emoticons/v1/304456832/1.0\",\n          \"url_2x\": \"https://static-cdn.jtvnw.net/emoticons/v1/304456832/2.0\",\n          \"url_4x\": \"https://static-cdn.jtvnw.net/emoticons/v1/304456832/3.0\"\n      },\n      \"tier\": \"1000\",\n      \"emote_type\": \"subscriptions\",\n      \"emote_set_id\": \"301590448\"\n    },\n    ...\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Global Emotes

    \n \n \n

    NEW Gets all global emotes. Global emotes are Twitch-specific emoticons that every user can use in Twitch chat.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/chat/emotes/global

    \n\n

    Pagination Support

    \n\n

    None.

    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the emote.
    namestringName of the emote a viewer types into Twitch chat for the image to appear.
    imagesobjectObject of image URLs for the emote.
    images.url_1xstringSmall emote image URL.
    images.url_2xstringMedium emote image URL.
    images.url_4xstringLarge emote image URL.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Global emotes returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns all global emotes.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/chat/emotes/global' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    ...\n    {\n      \"id\": \"196892\",\n      \"name\": \"TwitchUnity\",\n      \"images\": {\n          \"url_1x\": \"https://static-cdn.jtvnw.net/emoticons/v1/196892/1.0\",\n          \"url_2x\": \"https://static-cdn.jtvnw.net/emoticons/v1/196892/2.0\",\n          \"url_4x\": \"https://static-cdn.jtvnw.net/emoticons/v1/196892/3.0\"\n      }\n    },\n    ...\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Emote Sets

    \n \n \n

    NEW Gets all Twitch emotes for one or more specific emote sets.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/chat/emotes/set

    \n\n

    Pagination Support

    \n\n

    None.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    emote_set_idstringID(s) of the emote set.

    Minimum: 1. Maximum: 25.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringEmote ID.
    namestringName of the emote a viewer types into Twitch chat for the image to appear.
    imagesobjectObject of image URLs for the emote.
    images.url_1xstringSmall emote image URL.
    images.url_2xstringMedium emote image URL.
    images.url_4xstringLarge emote image URL.
    emote_typestringThe type of emote.
    emote_set_idstringID of the emote set the emote belongs to.
    owner_idstringUser ID of the broadcaster who owns the emote.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Emotes for specific emote sets returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns the emotes for the TwitchDev subscriber emote set.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/chat/emotes/set?emote_set_id=301590448' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"304456832\",\n      \"name\": \"twitchdevPitchfork\",\n      \"images\": {\n          \"url_1x\": \"https://static-cdn.jtvnw.net/emoticons/v1/304456832/1.0\",\n          \"url_2x\": \"https://static-cdn.jtvnw.net/emoticons/v1/304456832/2.0\",\n          \"url_4x\": \"https://static-cdn.jtvnw.net/emoticons/v1/304456832/3.0\"\n      },\n      \"emote_type\": \"subscriptions\",\n      \"emote_set_id\": \"301590448\",\n      \"owner_id\": \"141981764\"\n    },\n    ...\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Channel Chat Badges

    \n \n \n

    NEW Gets a list of custom chat badges that can be used in chat for the specified channel. This includes subscriber badges and Bit badges.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth Token
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/chat/badges

    \n\n

    Pagination Support

    \n\n

    None.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster whose chat badges are being requested. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    dataArray of objectsAn array of chat badge sets.
    set.set_idstringID for the chat badge set.
    set.versionsArray of objectsContains chat badge objects for the set.
    set.version.idstringID of the chat badge version.
    set.version.image_url_1xstringSmall image URL.
    set.version.image_url_2xstringMedium image URL.
    set.version.image_url_4xstringLarge image URL.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Channel chat badges returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns custom chat badges for the BlueLava Twitch channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/chat/badges?broadcaster_id=135093069' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"set_id\": \"bits\",\n      \"versions\": [\n        {\n          \"id\": \"1\",\n          \"image_url_1x\": \"https://static-cdn.jtvnw.net/badges/v1/743a0f3b-84b3-450b-96a0-503d7f4a9764/1\",\n          \"image_url_2x\": \"https://static-cdn.jtvnw.net/badges/v1/743a0f3b-84b3-450b-96a0-503d7f4a9764/2\",\n          \"image_url_4x\": \"https://static-cdn.jtvnw.net/badges/v1/743a0f3b-84b3-450b-96a0-503d7f4a9764/3\"\n        }\n      ]\n    },\n    {\n      \"set_id\": \"subscriber\",\n      \"versions\": [\n        {\n          \"id\": \"0\",\n          \"image_url_1x\": \"https://static-cdn.jtvnw.net/badges/v1/eb4a8a4c-eacd-4f5e-b9f2-394348310442/1\",\n          \"image_url_2x\": \"https://static-cdn.jtvnw.net/badges/v1/eb4a8a4c-eacd-4f5e-b9f2-394348310442/2\",\n          \"image_url_4x\": \"https://static-cdn.jtvnw.net/badges/v1/eb4a8a4c-eacd-4f5e-b9f2-394348310442/3\"\n        },\n        ...\n      ]\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Global Chat Badges

    \n \n \n

    NEW Gets a list of chat badges that can be used in chat for any channel.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/chat/badges/global

    \n\n

    Pagination Support

    \n\n

    None.

    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    dataArray of objectsAn array of chat badge sets.
    set.set_idstringID for the chat badge set.
    set.versionsArray of objectsContains chat badge objects for the set.
    set.version.idstringID of the chat badge version.
    set.version.image_url_1xstringSmall image URL.
    set.version.image_url_2xstringMedium image URL.
    set.version.image_url_4xstringLarge image URL.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Global chat badges returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns global chat badges.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/chat/badges/global' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    ...\n    {\n      \"set_id\": \"vip\",\n      \"versions\": [\n        {\n          \"id\": \"1\",\n          \"image_url_1x\": \"https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/1\",\n          \"image_url_2x\": \"https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/2\",\n          \"image_url_4x\": \"https://static-cdn.jtvnw.net/badges/v1/b817aba4-fad8-49e2-b88a-7cc744dfa6ec/3\"\n        }\n      ]\n    },\n    ...\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create Clip

    \n \n \n

    Creates a clip programmatically. This returns both an ID and an edit URL for the new clip.

    \n\n

    Note: The clips service returns a maximum of 1000 clips,

    \n\n

    Clip creation takes time. We recommend that you query Get Clips, with the clip ID that is returned here. If Get Clips returns a valid clip, your clip creation was successful. If, after 15 seconds, you still have not gotten back a valid clip from Get Clips, assume that the clip was not created and retry Create Clip.

    \n\n

    This endpoint has a global rate limit, across all callers. The limit may change over time, but the response includes informative headers:

    \n\n
    Ratelimit-Helixclipscreation-Limit: <int value>\nRatelimit-Helixclipscreation-Remaining: <int value>\n
    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: clips:edit\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/clips

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringID of the stream from which the clip will be made.
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    has_delaybooleanIf false, the clip is captured from the live stream when the API is called; otherwise, a delay is added before the clip is captured (to account for the brief delay between the broadcaster’s stream and the viewer’s experience of that stream). Default: false.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    edit_urlstringURL of the edit page for the clip.
    idstringID of the clip that was created.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/clips?broadcaster_id=44322889' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n   \"data\":\n   [{\n      \"id\": \"FiveWordsForClipSlug\",\n      \"edit_url\": \"http://clips.twitch.tv/FiveWordsForClipSlug/edit\"\n   }]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Clips

    \n \n \n

    Gets clip information by clip ID (one or more), broadcaster ID (one only), or game ID (one only).

    \n\n

    Note: The clips service returns a maximum of 1000 clips.

    \n\n

    The response has a JSON payload with a data field containing an array of clip information elements and a pagination field containing information required to query for more streams.

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/clips

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringID of the broadcaster for whom clips are returned. The number of clips returned is determined by the first query-string parameter (default: 20). Results are ordered by view count.
    game_idstringID of the game for which clips are returned. The number of clips returned is determined by the first query-string parameter (default: 20). Results are ordered by view count.
    idstringID of the clip being queried. Limit: 100.
    \n\n

    For a query to be valid, id (one or more), broadcaster_id, or game_id must be specified. You may specify only one of these parameters.

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. This applies only to queries specifying broadcaster_id or game_id. The cursor value specified here is from the pagination response field of a prior query.
    beforestringCursor for backward pagination: tells the server where to start fetching the next set of results, in a multi-page response. This applies only to queries specifying broadcaster_id or game_id. The cursor value specified here is from the pagination response field of a prior query.
    ended_atstringEnding date/time for returned clips, in RFC3339 format. (Note that the seconds value is ignored.) If this is specified, started_at also must be specified; otherwise, the time period is ignored.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    started_atstringStarting date/time for returned clips, in RFC3339 format. (The seconds value is ignored.) If this is specified, ended_at also should be specified; otherwise, the ended_at date/time will be 1 week after the started_at value.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    idstringID of the clip being queried.
    urlstringURL where the clip can be viewed.
    embed_urlstringURL to embed the clip.
    broadcaster_idstringUser ID of the stream from which the clip was created.
    broadcaster_namestringDisplay name corresponding to broadcaster_id.
    creator_idstringID of the user who created the clip.
    creator_namestringDisplay name corresponding to creator_id.
    video_idstringID of the video from which the clip was created.
    game_idstringID of the game assigned to the stream when the clip was created.
    languagestringLanguage of the stream from which the clip was created. A language value is either the ISO 639-1 two-letter code for a supported stream language or “other”.
    titlestringTitle of the clip.
    view_countintNumber of times the clip has been viewed.
    created_atstringDate when the clip was created.
    thumbnail_urlstringURL of the clip thumbnail.
    durationfloatDuration of the Clip in seconds (up to 0.1 precision).
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This gets information for clip AwkwardHelplessSalamanderSwiftRage.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/clips?id=AwkwardHelplessSalamanderSwiftRage' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response #1

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"AwkwardHelplessSalamanderSwiftRage\",\n      \"url\": \"https://clips.twitch.tv/AwkwardHelplessSalamanderSwiftRage\",\n      \"embed_url\": \"https://clips.twitch.tv/embed?clip=AwkwardHelplessSalamanderSwiftRage\",\n      \"broadcaster_id\": \"67955580\",\n      \"broadcaster_name\": \"ChewieMelodies\",\n      \"creator_id\": \"53834192\",\n      \"creator_name\": \"BlackNova03\",\n      \"video_id\": \"205586603\",\n      \"game_id\": \"488191\",\n      \"language\": \"en\",\n      \"title\": \"babymetal\",\n      \"view_count\": 10,\n      \"created_at\": \"2017-11-30T22:34:18Z\",\n      \"thumbnail_url\": \"https://clips-media-assets.twitch.tv/157589949-preview-480x272.jpg\",\n      \"duration\": 60\n    }\n  ]\n}\n
    \n\n

    Example Request #2

    \n\n

    This gets the top 5 clips from broadcaster 1234.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/clips?broadcaster_id=1234&first=5' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response #2

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"RandomClip1\",\n      \"url\": \"https://clips.twitch.tv/AwkwardHelplessSalamanderSwiftRage\",\n      \"embed_url\": \"https://clips.twitch.tv/embed?clip=RandomClip1\",\n      \"broadcaster_id\": \"1234\",\n      \"broadcaster_name\": \"JJ\",\n      \"creator_id\": \"123456\",\n      \"creator_name\": \"MrMarshall\",\n      \"video_id\": \"1234567\",\n      \"game_id\": \"33103\",\n      \"language\": \"en\",\n      \"title\": \"random1\",\n      \"view_count\": 10,\n      \"created_at\": \"2017-11-30T22:34:18Z\",\n      \"thumbnail_url\": \"https://clips-media-assets.twitch.tv/157589949-preview-480x272.jpg\",\n      \"duration\": 12.9\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjoiIn0\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Code Status

    \n \n \n \n

    Gets the status of one or more provided codes. This API requires that the caller is an authenticated Twitch user. The API is throttled to one request per second per authenticated user.\nCodes are redeemable alphanumeric strings tied only to the bits product. This third-party API allows other parties to redeem codes on behalf of users. Third-party app and extension developers can use the API to provide rewards of bits from within their games.

    \n\n

    We provide sets of codes to the third party as part of a contract agreement. The third-party program then calls this API to credit a Twitch user by submitting any specific codes. This means that a bits reward can be applied without users having to follow any manual steps.

    \n\n

    All codes are single-use. Once a code has been redeemed, via either this API or the site page, then the code is no longer valid for any further use.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/entitlements/codes

    \n\n

    Authentication

    \n\n

    Access is controlled via an app access token on the calling service. The client ID associated with the app access token must be approved by Twitch as part of a contracted arrangement.

    \n\n

    Authorization

    \n\n

    Callers with an app access token are authorized to redeem codes on behalf of any Twitch user account.

    \n\n

    Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParamTypeDescription
    codeStringThe code to get the status of. Repeat this query parameter additional times to get the status of multiple codes.
    Ex: ?code=code1&code=code2
    1-20 code parameters are allowed.
    user_idIntegerRepresents a numeric Twitch user ID.
    The user account which is going to receive the entitlement associated with the code.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    ParamTypeDescription
    dataArray of payloads each of which includes code (string) and status (string).Indicates the current status of each key when checking key status. 

    Indicates the success or error state of each key when redeeming.
    \n\n

    Code Statuses

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeDescription
    SUCCESSFULLY_REDEEMEDRequest successfully redeemed this code to the authenticated user’s account.This status will only ever be encountered when calling the POST API to redeem a key.
    ALREADY_CLAIMEDCode has already been claimed by a Twitch user.
    EXPIREDCode has expired and can no longer be claimed.
    USER_NOT_ELIGIBLEUser is not eligible to redeem this code.
    NOT_FOUNDCode is not valid and/or does not exist in our database.
    INACTIVECode is not currently active.
    UNUSEDCode has not been claimed.This status will only ever be encountered when calling the GET API to get a keys status.
    INCORRECT_FORMATCode was not properly formatted.
    INTERNAL_ERRORIndicates some internal and/or unknown failure handling this code.
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/entitlements/codes?code=KUHXV-4GXYP-AKAKK&code=XZDDZ-5SIQR-RT5M3&user_id=156900877' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n

    Example Response

    \n\n
    {\n  \"data\":[\n    {\n      \"code\":\"KUHXV-4GXYP-AKAKK\",\n      \"status\":\"UNUSED\"\n    },\n    {\n      \"code\":\"XZDDZ-5SIQR-RT5M3\",\n      \"status\":\"ALREADY_CLAIMED\"\n    }\n  ]\n}\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Drops Entitlements

    \n \n \n

    Gets a list of entitlements for a given organization that have been granted to a game, user, or both.

    \n\n

    Authentication

    \n\n

    App Access OAuth Token required.

    \n\n

    Authorization

    \n\n

    OAuth Token Client ID must have ownership of Game:

    \n\n
      \n
    • \nClient ID > Organization ID > Game ID\n
    • \n
    \n\n

    Pagination support

    \n\n

    Forward only

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/entitlements/drops

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringUnique Identifier of the entitlement
    user_idstringA Twitch User ID
    game_idstringA Twitch Game ID
    afterstringThe cursor used to fetch the next page of data.
    firstintegerMaximum number of entitlements to return.
    Default: 20
    Max: 1000
    \n\n

    Valid combinations of requests are:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Authorization ProvidedRequest Fields PresentData Returned
    \nApp Access
    OAuth Token
     
    No fieldsAll entitlements with benefits owned by your organization.
     user_idAll entitlements for a user with benefits owned by your organization.
     \nuser_id, game_id\nAll entitlements for the game granted to a user. Your organization must own the game.
     game_idAll entitlements for all users for a game. Your organization must own the game.
    User OAuth TokenNo fieldsAll entitlements owned by that user with benefits owned by your organization.
     user_idInvalid
     \nuser_id, game_id\nInvalid
     game_idAll entitlements owned by a user for the specified game. Your organization must own the game.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    dataarrayArray of entitlements
    idstringUnique Identifier of the entitlement
    benefit_idstringIdentifier of the Benefit
    timestampstringUTC timestamp in ISO format when this entitlement was granted on Twitch.
    user_idstringTwitch User ID of the user who was granted the entitlement.
    game_idstringTwitch Game ID of the game that was being played when this benefit was entitled.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    \n\n

    Response Codes

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    HTTP CodeMeaning
    200 OKResource found
    400 Bad Request
      \n
    • Malformed request
    • \n
    • User ID not valid
    • \n
    • Game ID not valid
    • \n
    401 Unauthorized
      \n
    • API handles authorization
    • \n
    • Client ID not owned by Organization
    • \n
    429 Rate LimitAPI will handle rate limiting
    500 Internal Server Error 
    503 Service Unavailable 
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -H GET 'helix/entitlements/drops?user_id=25009227&game_id=33214' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"fb78259e-fb81-4d1b-8333-34a06ffc24c0\",\n      \"benefit_id\": \"74c52265-e214-48a6-91b9-23b6014e8041\",\n      \"timestamp\": \"2019-01-28T04:17:53.325Z\",\n      \"user_id\": \"25009227\",\n      \"game_id\": \"33214\"\n    },\n    {\n      \"id\": \"862750a5-265e-4ab6-9f0a-c64df3d54dd0\",\n      \"benefit_id\": \"74c52265-e214-48a6-91b9-23b6014e8041\",\n      \"timestamp\": \"2019-01-28T04:16:53.325Z\",\n      \"user_id\": \"25009227\",\n      \"game_id\": \"33214\"\n    },\n    {\n      \"id\": \"d8879baa-3966-4d10-8856-15fdd62cce02\",\n      \"benefit_id\": \"cdfdc5c3-65a2-43bc-8767-fde06eb4ab2c\",\n      \"timestamp\": \"2019-01-28T04:15:53.325Z\",\n      \"user_id\": \"25009227\",\n      \"game_id\": \"33214\"\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudW...\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Redeem Code

    \n \n \n

    Redeems one or more provided codes to the authenticated Twitch user. This API requires that the caller is an authenticated Twitch user. This API requires that the caller is an authenticated Twitch user. The API is throttled to one request per second per authenticated user. Codes are redeemable alphanumeric strings tied only to the bits product. This third-party API allows other parties to redeem codes on behalf of users. Third-party app and extension developers can use the API to provide rewards of bits from within their games. We provide sets of codes to the third party as part of a contract agreement. The third-party program then calls this API to credit the Twitch user by submitting any specific codes. This means that a bits reward can be applied without the user having to follow any manual steps.

    \n\n

    All codes are single-use. Once a code has been redeemed, via either this API or the site page, the code is no longer valid for any further use.

    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/entitlements/codes

    \n\n

    Authentication

    \n\n

    Access is controlled via an app access token on the calling service. The client ID associated with the app access token must be approved by Twitch.

    \n\n

    Authorization

    \n\n

    Callers with an app access token are authorized to redeem codes on behalf of any Twitch user account.

    \n\n

    Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    codeStringThe code to redeem to the authenticated user’s account.

    A fifteen character (plus optional hyphen separators) alphanumeric string, e.g. ABCDE-12345-FGHIJ

    Repeat this query parameter additional times to redeem multiple codes.
    Ex: ?code=code1&code=code2
    1-20 code parameters are allowed.
    user_idIntegerRepresents a numeric Twitch user ID.
    The user account which is going to receive the entitlement associated with the code.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    dataArray of payloads each of which includes code (string) and status (string).Indicates the success or error state of each key when redeeming. 
    \n\n

    Code Statuses

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeDescription
    SUCCESSFULLY_REDEEMEDRequest successfully redeemed this code to the authenticated user’s account. This status will only ever be encountered when calling the POST API to redeem a key.
    ALREADY_CLAIMEDCode has already been claimed by a Twitch user.
    EXPIREDCode has expired and can no longer be claimed.
    USER_NOT_ELIGIBLEUser is not eligible to redeem this code.
    NOT_FOUNDCode is not valid and/or does not exist in our database.
    INACTIVECode is not currently active.
    UNUSEDCode has not been claimed. This status will only ever be encountered when calling the GET API to get a key’s status.
    INCORRECT_FORMATCode was not properly formatted.
    INTERNAL_ERRORIndicates some internal and/or unknown failure handling this code.
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/entitlements/codes?code=8CD5P-V3J92-2S6JY&code=PUN4G-HYFVP-MMFET' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\":[\n    {\n      \"code\":\"8CD5P-V3J92-2S6JY\",\n      \"status\":\"SUCCESSFULLY_REDEEMED\"\n    },\n    {\n      \"code\":\"PUN4G-HYFVP-MMFET\",\n      \"status\":\"ALREADY_CLAIMED\"\n    }\n  ]\n}\n
    \n\n

     

    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create EventSub Subscription

    \n \n \n

    Creates an EventSub subscription.

    \n

    Authentication

    \n
      \n
    • App Access Token
    • \n
    \n\n

    URL

    \n

    POST https://api.twitch.tv/helix/eventsub/subscriptions

    \n\n

    Required Query Parameters

    \n

    None

    \n\n

    Required Body Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    typestringThe category of the subscription that is being created. Valid subscription types can be found here.
    versionstringThe version of the subscription type that is being created. Each subscription type has independent versioning.
    conditionconditionJSON object containing custom parameters for a particular subscription.
    transporttransportJSON object containing notification delivery specific configuration including a method string. Valid transport methods include: webhook. In addition to the method string, a webhook transport must include the callback and secret information.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    dataarrayArray containing 1 element: the created subscription.
    idstringID of the subscription created.
    statusstringStatus of the subscription. Valid values are:

    enabled: designates that the subscription is in an operable state and is valid.

    webhook_callback_verification_pending: webhook is pending verification of the callback specified in the subscription creation request.

    webhook_callback_verification_failed: webhook failed verification of the callback specified in the subscription creation request.

    notification_failures_exceeded: notification delivery failure rate was too high.

    authorization_revoked: authorization for user(s) in the condition was revoked.

    user_removed: a user in the condition of the subscription was removed.
    typestringThe category of the subscription that was created.
    versionstringThe version of the subscription type that was created.
    conditionconditionJSON object specifying custom parameters for the subscription.
    created_atstringRFC3339 timestamp indicating when the subscription was created.
    transporttransportJSON object indicating the notification delivery specific information. Includes the transport method and callback URL.
    totalintegerTotal number of subscriptions for the client ID that made the subscription creation request.
    total_costintegerTotal cost of all the subscriptions for the client ID that made the subscription creation request.
    max_total_costintegerThe maximum total cost allowed for all of the subscriptions for the client ID that made the subscription creation request.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    .

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/eventsub/subscriptions' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n-H 'Content-Type: application/json' \\\n-d '{\"type\":\"users.update\",\"version\":\"1\",\"condition\":{\"user_id\":\"1234\"},\"transport\":{\"method\":\"webhook\",\"callback\":\"https://this-is-a-callback.com\",\"secret\":\"s3cre7\"}}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"26b1c993-bfcf-44d9-b876-379dacafe75a\",\n      \"status\": \"webhook_callback_verification_pending\",\n      \"type\": \"users.update\",\n      \"version\": \"1\",\n      \"condition\": {\n        \"user_id\": \"1234\"\n      },\n      \"created_at\": \"2020-11-10T20:29:44Z\",\n      \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://this-is-a-callback.com\"\n      },\n      \"cost\": 1\n    }\n  ],\n  \"total\": 1,\n  \"total_cost\": 1,\n  \"max_total_cost\": 10000\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Delete EventSub Subscription

    \n \n \n

    Delete an EventSub subscription.

    \n\n

    Authentication

    \n\n
      \n
    • App Access Token
    • \n
    \n\n

    URL

    \n

    DELETE https://api.twitch.tv/helix/eventsub/subscriptions

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe subscription ID for the subscription you want to delete.
    \n\n

    Response Fields

    \n\n

    None

    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    204Subscription deleted successfully.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Deletes an EventSub subscription.

    \n\n
    curl -X DELETE 'https://api.twitch.tv/helix/eventsub/subscriptions?id=26b1c993-bfcf-44d9-b876-379dacafe75a' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n
    \n\n

    Example Response

    \n\n
    204 No Content\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get EventSub Subscriptions

    \n \n \n

    Get a list of your EventSub subscriptions. The subscriptions are paginated and ordered by most recent first.

    \n\n

    Authentication

    \n\n
      \n
    • App Access Token
    • \n
    \n\n

    URL

    \n

    GET https://api.twitch.tv/helix/eventsub/subscriptions

    \n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n

    Use parameters to filter by subscription status or type. Only include one filter query parameter; if you specify both status and type parameters, you will receive an error response.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    statusstringInclude this parameter to filter subscriptions by one status type. Valid values:

    enabled: the subscription is in an operable state and is valid.

    webhook_callback_verification_pending: subscription is pending verification of the callback specified in the subscription creation request.

    webhook_callback_verification_failed: subscription failed verification of the callback specified in the subscription creation request.

    notification_failures_exceeded: notification delivery failure rate was too high.

    authorization_revoked: authorization for user(s) in the condition was revoked.

    user_removed: a user in the condition of the subscription was removed.
    typestringInclude this parameter to filter subscriptions by subscription type name (e.g., channel.update).
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    dataarrayArray containing subscriptions.
    idstringID of the subscription.
    statusstringStatus of the subscription. Valid values are:

    enabled: designates that the subscription is in an operable state and is valid.

    webhook_callback_verification_pending: webhook is pending verification of the callback specified in the subscription creation request.

    webhook_callback_verification_failed: webhook failed verification of the callback specified in the subscription creation request.

    notification_failures_exceeded: notification delivery failure rate was too high.

    authorization_revoked: authorization for user(s) in the condition was revoked.

    user_removed: a user in the condition of the subscription was removed.
    typestringThe category of the subscription.
    versionstringThe version of the subscription.
    conditionconditionJSON object specifying custom parameters for the subscription.
    created_atstringRFC3339 timestamp indicating when the subscription was created.
    transporttransportJSON object indicating the notification delivery specific information. Includes the transport method and callback URL.
    totalintegerTotal number of subscriptions for the client ID that made the subscription creation request.
    total_costintegerTotal cost of all the subscriptions for the client ID that made the subscription creation request.
    max_total_costintegerThe maximum total cost allowed for all of the subscriptions for the client ID that made the subscription creation request.
    paginationobjectA cursor value to be used in a subsequent request to specify the starting point of the next set of results.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Get a list of your EventSub subscriptions. The subscriptions are paginated and ordered by most recent first.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/eventsub/subscriptions' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n
    \n\n

    Example Response

    \n\n
    {\n  \"total\": 2,\n  \"data\": [\n    {\n      \"id\": \"26b1c993-bfcf-44d9-b876-379dacafe75a\",\n      \"status\": \"enabled\",\n      \"type\": \"streams.online\",\n      \"version\": \"1\",\n      \"condition\": {\n        \"broadcaster_user_id\": \"1234\"\n      },\n      \"created_at\": \"2020-11-10T20:08:33Z\",\n      \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://this-is-a-callback.com\"\n      },\n      \"cost\": 1\n    },\n    {\n      \"id\": \"35016908-41ff-33ce-7879-61b8dfc2ee16\",\n      \"status\": \"webhook-callback-verification-pending\",\n      \"type\": \"users.update\",\n      \"version\": \"1\",\n      \"condition\": {\n        \"user_id\": \"1234\"\n      },\n      \"created_at\": \"2020-11-10T20:31:52Z\",\n      \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://this-is-a-callback.com\"\n      },\n      \"cost\": 0\n    }\n  ],\n  \"total_cost\": 1,\n  \"max_total_cost\": 10000,\n  \"pagination\": {}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Top Games

    \n \n \n

    Gets games sorted by number of current viewers on Twitch, most popular first.

    \n\n

    The response has a JSON payload with a data field containing an array of games information elements and a pagination field containing information required to query for more streams.

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/games/top

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    beforestringCursor for backward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    box_art_urlobjectTemplate URL for a game’s box art.
    idstringGame ID.
    namestringGame name.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets the 20 currently most-viewed games.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/games/top' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"493057\",\n      \"name\": \"PLAYERUNKNOWN'S BATTLEGROUNDS\",\n      \"box_art_url\": \"https://static-cdn.jtvnw.net/ttv-boxart/PLAYERUNKNOWN%27S%20BATTLEGROUNDS-{width}x{height}.jpg\"\n    },\n    ...\n  ],\n  \"pagination\":{\"cursor\":\"eyJiIjpudWxsLCJhIjp7Ik9mZnNldCI6MjB9fQ==\"}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Games

    \n \n \n

    Gets game information by game ID or name.

    \n\n

    The response has a JSON payload with a data field containing an array of games elements.

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/games

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringGame ID. At most 100 id values can be specified.
    namestringGame name. The name must be an exact match. For example, “Pokemon” will not return a list of Pokemon games; instead, query any specific Pokemon games in which you are interested. At most 100 name values can be specified.
    \n\n

    For a query to be valid, name and/or id must be specified.

    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldsTypeDescription
    box_art_urlobjectTemplate URL for the game’s box art.
    idstringGame ID.
    namestringGame name.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets information for game ID 493057.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/games?id=493057' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n    \"data\": [\n        {\n            \"box_art_url\": \"https://static-cdn.jtvnw.net/ttv-boxart/Fortnite-52x72.jpg\",\n            \"id\": \"33214\",\n            \"name\": \"Fortnite\"\n        }\n    ... ],\n    \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Hype Train Events

    \n \n \n

    Description

    \n\n

    Gets the information of the most recent Hype Train of the given channel ID. When there is currently an active Hype Train, it returns information about that Hype Train. When there is currently no active Hype Train, it returns information about the most recent Hype Train. After 5 days, if no Hype Train has been active, the endpoint will return an empty response.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth Token
    • \n
    • Required scope: channel:read:hype_train\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/hypetrain/events

    \n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringUser ID of the broadcaster. Must match the User ID in the Bearer token if User Token is used.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 1.
    idstringThe id of the wanted event, if known
    cursorstringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without id. If an ID is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringThe distinct ID of the event
    event_typestringDisplays hypetrain.{event_name}, currently only hypetrain.progression
    event_timestampstringRFC3339 formatted timestamp of event
    versionstringReturns the version of the endpoint
    event_dataobject(See below for the schema)
      id\nstringThe distinct ID of this Hype Train
      broadcaster_id\nstringChannel ID of which Hype Train events the clients are interested in
      started_at\nstringRFC3339 formatted timestamp of when this Hype Train started
      expires_at\nstringRFC3339 formatted timestamp of the expiration time of this Hype Train
      cooldown_end_time\nstringRFC3339 formatted timestamp of when another Hype Train can be started again
      level\nintegerThe highest level (in the scale of 1-5) reached of the Hype Train
      goal\nintegerThe goal value of the level above
      total\nintegerThe total score so far towards completing the level goal above
      top_contributions\nobjectAn array of top contribution objects, one object for each type.  For example, one object would represent top contributor of BITS, by aggregate, and one would represent top contributor of SUBS by count.
        total\nintegerTotal aggregated amount of all contributions by the top contributor. If type is BITS, total represents aggregate amount of bits used.  If type is SUBS, aggregate total where 500, 1000, or 2500 represent tier 1, 2, or 3 subscriptions respectively.  For example, if top contributor has gifted a tier 1, 2, and 3 subscription, total would be 4000.
        type\nstringIdentifies the contribution method, either BITS or SUBS\n
        user\nstringID of the contributing user
    last_contributionobjectAn object that represents the most recent contribution
        total\nintegerTotal amount contributed. If type is BITS, total represents amounts of bits used.  If type is SUBS, total is 500, 1000, or 2500 to represent tier 1, 2, or 3 subscriptions respectively
        type\nstringIdentifies the contribution method, either BITS or SUBS\n
        user\nstringID of the contributing user
    paginationstringA cursor value, to be used in a subsequent requests to specify the starting point of the next set of results
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X GET\n'https://api.twitch.tv/helix/hypetrain/events?broadcaster_id=270954519&first=1' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1b0AsbInCHZW2SQFQkCzqN07Ib2\",\n      \"event_type\": \"hypetrain.progression\",\n      \"event_timestamp\": \"2020-04-24T20:07:24Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"270954519\",\n        \"cooldown_end_time\": \"2020-04-24T20:13:21.003802269Z\",\n        \"expires_at\": \"2020-04-24T20:12:21.003802269Z\",\n        \"goal\": 1800,\n        \"id\": \"70f0c7d8-ff60-4c50-b138-f3a352833b50\",\n        \"last_contribution\": {\n          \"total\": 200,\n          \"type\": \"BITS\",\n          \"user\": \"134247454\"\n        },\n        \"level\": 2,\n        \"started_at\": \"2020-04-24T20:05:47.30473127Z\",\n        \"top_contributions\": [\n          {\n            \"total\": 600,\n            \"type\": \"BITS\",\n            \"user\": \"134247450\"\n          }\n        ],\n        \"total\": 600\n      }\n    }\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IjI3MDk1NDUxOToxNTg3NzU4ODQ0OjFiMEFzYkluQ0haVzJTUUZRa0N6cU4wN0liMiJ9fQ\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Check AutoMod Status

    \n \n \n

    Determines whether a string message meets the channel’s AutoMod requirements.

    \n\n

    AutoMod is a moderation tool that blocks inappropriate or harassing chat with powerful moderator control. AutoMod detects misspellings and evasive language automatically. AutoMod uses machine learning and natural language processing algorithms to hold risky messages from chat so they can be reviewed by a channel moderator before appearing to other viewers in the chat. Moderators can approve or deny any message caught by AutoMod. 

    \n\n

    For more information about AutoMod, see How to Use AutoMod.

    \n\n

    Authorization

    \n\n
      \n
    • OAuth token required
    • \n
    • Required Scope: moderation:read\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/moderation/enforcements/status

    \n\n

    Pagination Support

    \n\n

    None.

    \n\n

    Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterRequiredTypeDescription
    broadcaster_idyesstringProvided broadcaster_id must match the user_id in the auth token.
    \n\n

    Body Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterRequiredTypeDescription
    msg_idyesstringDeveloper-generated identifier for mapping messages to results.
    msg_textyesstringMessage text.
    user_idyesstringUser ID of the sender.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    msg_idstringThe msg_id passed in the body of the POST message. Maps each message to its status.
    is_permittedBooleanIndicates if this message meets AutoMod requirements.
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Checks to see if the messages “Hello World!” and “Boooooo!” meets AutoMod requirements.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/moderation/enforcements/status' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-d '{\n  \"data\": [\n    {\n      \"msg_id\": \"123\",\n      \"msg_text\": \"Hello World!\",\n      \"user_id\": \"23749\"\n    },\n    {\n      \"msg_id\": \"393\",\n      \"msg_text\": \"Boooooo!\",\n      \"user_id\": \"23422\"\n    }\n  ]\n}'\n
    \n\n

    Example Response

    \n\n

    Shows that message ID 123 meets the requirements and message ID 393 does not.

    \n\n
    {\n  \"data\": [\n    {\n      \"msg_id\": \"123\",\n      \"is_permitted\": true\n    },\n    {\n      \"msg_id\": \"393\",\n      \"is_permitted\": false\n    }\n  ]\n}\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Manage Held AutoMod Messages

    \n \n \n

    Allow or deny a message that was held for review by AutoMod.

    \n\n

    In order to retrieve messages held for review, use the chat_moderator_actions topic via PubSub. For more information about AutoMod, see How to Use AutoMod.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token required
    • \n
    • Required Scope: moderator:manage:automod\n
    • \n
    \n\n

    Note that the scope allows this endpoint to be used for any channel that the authenticated user is a moderator, including their own channel.

    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/moderation/automod/message

    \n\n

    Required Body Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    user_idstringThe moderator who is approving or rejecting the held message. Must match the user_id in the user OAuth token.
    msg_idstringID of the message to be allowed or denied. These message IDs are retrieved from PubSub as mentioned above. Only one message ID can be provided.
    actionstringThe action to take for the message. Must be \"ALLOW\" or \"DENY\".
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    204Message was approved or denied successfully.
    400Message was already processed or an invalid action was provided.
    401Authentication failure.
    403Requesting user is not authorized to process messages for this channel.
    404Message not found or invalid msg_id.
    \n\n \n
    \n\n \n
    \n \n

    Example Request 1

    \n\n

    Allow a message being held by AutoMod.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/moderation/automod/message' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-d '{\n  \"user_id\": \"9327994\",\n  \"msg_id\": \"836013710\",\n  \"action\": \"ALLOW\"\n}'\n
    \n\n

    Example Response 1

    \n\n

    Shows that a message was successfully allowed.

    \n\n
    204 No Content\n
    \n\n

    Example Request 2

    \n\n

    Deny a message being held by AutoMod.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/moderation/automod/message' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-d '{\n  \"user_id\": \"9327994\",\n  \"msg_id\": \"836013710\",\n  \"action\": \"DENY\"\n}'\n
    \n\n

    Example Response 2

    \n\n

    Shows that a message was successfully denied.

    \n\n
    204 No Content\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Banned Events

    \n \n \n

    Returns all user bans and un-bans in a channel.

    \n\n

    Authorization

    \n\n
      \n
    • OAuth token required
    • \n
    • Required Scope: moderation:read\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/moderation/banned/events

    \n\n

    Pagination Support

    \n\n

    Forward pagination.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterRequiredTypeDescription
    broadcaster_idyesstringProvided broadcaster_id must match the user_id in the auth token.

    Maximum: 1
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterRequiredTypeDescription
    user_idnostringFilters the results and only returns a status object for ban events that include users being banned or un-banned in this channel and have a matching user_id.

    Format: Repeated Query Parameter, eg. /moderation/banned/events?broadcaster_id=1&user_id=2&user_id=3

    Maximum: 100
    afternostringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without user_id. If a user_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    firstnostringMaximum number of objects to return. Maximum: 100. Default: 20.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringEvent ID
    event_typestringDisplays moderation.user.ban or moderation.user.unban\n
    event_timestampstringRFC3339 formatted timestamp for events.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    versionstringReturns the version of the endpoint.
    event_datastringsReturns broadcaster_id, broadcaster_login, broadcaster_name, user_id, user_login, user_name, and expires_at.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns all bans and un-bans for Broadcaster 198704263.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/moderation/banned/events?broadcaster_id=198704263' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1IPFqAb0p0JncbPSTEPhx8JF1Sa\",\n      \"event_type\": \"moderation.user.ban\",\n      \"event_timestamp\": \"2019-03-13T15:55:14Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_login\": \"racageneg\",\n        \"broadcaster_name\": \"racageneg\",\n        \"user_id\": \"424596340\",\n        \"user_login\": \"quotrok\",\n        \"user_name\": \"quotrok\",\n        \"expires_at\": \"\"\n      }\n    },\n    {\n      \"id\": \"1IPFsDv5cs4mxfJ1s2O9Q5flf4Y\",\n      \"event_type\": \"moderation.user.unban\",\n      \"event_timestamp\": \"2019-03-13T15:55:30Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_login\": \"racageneg\",\n        \"broadcaster_name\": \"racageneg\",\n        \"user_id\": \"424596340\",\n        \"user_login\": \"quotrok\",\n        \"user_name\": \"quotrok\",\n        \"expires_at\": \"\"\n      }\n    },\n    {\n      \"id\": \"1IPFqmlu9W2q4mXXjULyM8zX0rb\",\n      \"event_type\": \"moderation.user.ban\",\n      \"event_timestamp\": \"2019-03-13T15:55:19Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_login\": \"racageneg\",\n        \"broadcaster_name\": \"racageneg\",\n        \"user_id\": \"424596340\",\n        \"user_login\": \"quotrok\",\n        \"user_name\": \"quotrok\",\n        \"expires_at\": \"\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IjE5OTYwNDI2MzoyMDIxMjA1MzE6MUlQRnFtbHU5VzJxNG1YWGpVTHlNOHpYMHJiIn19\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Banned Users

    \n \n \n

    Returns all banned and timed-out users in a channel.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: moderation:read\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/moderation/banned

    \n\n

    Pagination Support

    \n\n

    Forward and reverse pagination.

    \n\n

    Required Query Parameter

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterRequiredTypeDescription
    broadcaster_idyesstringProvided broadcaster_id must match the user_id in the auth token.

    Maximum: 1
    \n\n

    Optional Query Parameters

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterRequiredTypeDescription
    user_idnostringFilters the results and only returns a status object for users who are banned in this channel and have a matching user_id.

    Format: Repeated Query Parameter, eg. /moderation/banned?broadcaster_id=1&user_id=2&user_id=3

    Maximum: 100
    firstnostringMaximum number of objects to return. Maximum: 100. Default: 20.
    afternostringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without user_id. If a user_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    beforenostringCursor for backward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without user_id. If a user_id is specified, it supersedes any cursor/offset. combinations. The cursor value specified here is from the pagination response field of a prior query.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    user_idstringUser ID of a user who has been banned.
    user_loginstringLogin of a user who has been banned.
    user_namestringDisplay name of a user who has been banned.
    expires_atstring 
    paginationobject containing a string 
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Gets the users who have been banned by Broadcaster 198704263.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/moderation/banned?broadcaster_id=198704263' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n

    Shows that users glowillig and quotrok have been banned.

    \n\n
    {\n  \"data\": [\n    {\n      \"user_id\": \"423374343\",\n      \"user_login\": \"glowillig\",\n      \"user_name\": \"glowillig\",\n      \"expires_at\": \"2019-03-15T02:00:28Z\"\n    },\n    {\n      \"user_id\": \"424596340\",\n      \"user_login\": \"quotrok\",\n      \"user_name\": \"quotrok\",\n      \"expires_at\": \"2018-08-07T02:07:55Z\"\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IjEwMDQ3MzA2NDo4NjQwNjU3MToxSVZCVDFKMnY5M1BTOXh3d1E0dUdXMkJOMFcifX0\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Moderators

    \n \n \n

    Returns all moderators in a channel. Note: This endpoint does not return the broadcaster in the response, as broadcasters are channel owners and have all permissions of moderators implicitly.

    \n\n

    Authorization

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: moderation:read\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/moderation/moderators

    \n\n

    Pagination Support

    \n\n

    Forward pagination only.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the auth token. Maximum: 1
    \n\n

    Optional Query Parameters

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterTypeDescription
    user_idstringFilters the results and only returns a status object for users who are moderators in this channel and have a matching user_id.

    Format: Repeated Query Parameter, eg. /moderation/moderators?broadcaster_id=1&user_id=2&user_id=3

    Maximum: 100
    firststringMaximum number of objects to return. Maximum: 100. Default: 20.
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without user_id. If a user_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    user_idstringUser ID of a moderator in the channel.
    user_loginstringLogin of a moderator in the channel.
    user_namestringDisplay name of a moderator in the channel.
    paginationobject containing a stringA cursor value, to be used in subsequent requests to specify the starting point of the next set of results.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request returns any moderators for Broadcaster ID 198704263.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/moderation/moderators?broadcaster_id=198704263' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"user_id\": \"424596340\",\n      \"user_login\": \"quotrok\",\n      \"user_name\": \"quotrok\"\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IjEwMDQ3MzA2NDo4NjQwNjU3MToxSVZCVDFKMnY5M1BTOXh3d1E0dUdXMkJOMFcifX0\"\n  }\n}\n
    \n\n

     

    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Moderator Events

    \n \n \n

    Returns a list of moderators or users added and removed as moderators from a channel.

    \n\n

    Authorization

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: moderation:read\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/moderation/moderators/events

    \n\n

    Pagination Support

    \n\n

    Forward pagination only.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringProvided broadcaster_id must match the user_id in the auth token.

    Maximum: 1
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    user_idstringFilters the results and only returns a status object for users who have been added or removed as moderators in this channel and have a matching user_id.

    Format: Repeated Query Parameter, e.g. /moderation/moderators/events?broadcaster_id=1&user_id=2&user_id=3

    Maximum: 100
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without user_id. If a user_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    firststringMaximum number of objects to return. Maximum: 100. Default: 20.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringUser ID of the moderator.
    event_typestringDisplays moderation.moderator.add or moderation.moderator.remove\n
    event_timestampstringRFC3339 formatted timestamp for events.
    paginationobject containing a stringA cursor value to be used in a subsequent request to specify the starting point of the next set of results.
    versionstringReturns the version of the endpoint.
    broadcaster_idstringID of the broadcaster adding or removing moderators.
    broadcaster_loginstringLogin of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    user_idstringID of the user being added or removed as moderator.
    user_loginstringLogin of the user.
    user_namestringName of the user.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns users added or removed as moderators for Broadcaster ID 198704263.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/moderation/moderators/events?broadcaster_id=198704263' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1IVBTnDSUDApiBQW4UBcVTK4hPr\",\n      \"event_type\": \"moderation.moderator.remove\",\n      \"event_timestamp\": \"2019-03-15T18:18:14Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_login\": \"aan22209\",\n        \"broadcaster_name\": \"aan22209\",\n        \"user_id\": \"423374343\",\n        \"user_login\": \"glowillig\",\n        \"user_name\": \"glowillig\"\n      }\n    },\n    {\n      \"id\": \"1IVIPQdYIEnD8nJ376qkASDzsj7\",\n      \"event_type\": \"moderation.moderator.add\",\n      \"event_timestamp\": \"2019-03-15T19:15:13Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_login\": \"aan22209\",\n        \"broadcaster_name\": \"aan22209\",\n        \"user_id\": \"423374343\",\n        \"user_login\": \"glowillig\",\n        \"user_name\": \"glowillig\"\n      }\n    },\n    {\n      \"id\": \"1IVBTP7gG61oXLMu7fvnRhrpsro\",\n      \"event_type\": \"moderation.moderator.remove\",\n      \"event_timestamp\": \"2019-03-15T18:18:11Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_login\": \"aan22209\",\n        \"broadcaster_name\": \"aan22209\",\n        \"user_id\": \"424596340\",\n        \"user_login\": \"quotrok\",\n        \"user_name\": \"quotrok\"\n      }\n    }\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IjEwMDQ3MzA2NDo4NjQwNjU3MToxSVZCVDFKMnY5M1BTOXh3d1E0dUdXMkJOMFcifX0\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Polls

    \n \n \n

    NEW Get information about all polls or specific polls for a Twitch channel. Poll information is available for 90 days.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:read:polls\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/polls

    \n\n

    Pagination Support

    \n\n

    Forward pagination.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster running polls. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of a poll. Filters results to one or more specific polls. Not providing one or more IDs will return the full list of polls for the authenticated channel.

    Maximum: 100
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firststringMaximum number of objects to return.

    Maximum: 20. Default: 20.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the poll.
    broadcaster_idstringID of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    titlestringQuestion displayed for the poll.
    choicesobject[]Array of the poll choices.
    choice.idstringID for the choice.
    choice.titlestringText displayed for the choice.
    choice.votesintegerTotal number of votes received for the choice across all methods of voting.
    choice.channel_points_votesintegerNumber of votes received via Channel Points.
    choice.bits_votesintegerNumber of votes received via Bits.
    bits_voting_enabledbooleanIndicates if Bits can be used for voting.
    bits_per_voteintegerNumber of Bits required to vote once with Bits.
    channel_points_voting_enabledbooleanIndicates if Channel Points can be used for voting.
    channel_points_per_voteintegerNumber of Channel Points required to vote once with Channel Points.
    statusstringPoll status. Valid values are:

    ACTIVE: Poll is currently in progress.

    COMPLETED: Poll has reached its ended_at time.

    TERMINATED: Poll has been manually terminated before its ended_at time.

    ARCHIVED: Poll is no longer visible on the channel.

    MODERATED: Poll is no longer visible to any user on Twitch.

    INVALID: Something went wrong determining the state.
    durationintegerTotal duration for the poll (in seconds).
    started_atstringUTC timestamp for the poll’s start time.
    ended_atstringUTC timestamp for the poll’s end time. Set to null if the poll is active.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Poll details returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns information for a specific poll created for the TwitchDev channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/polls?broadcaster_id=141981764&id=ed961efd-8a3f-4cf5-a9d0-e616c590cd2a' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"ed961efd-8a3f-4cf5-a9d0-e616c590cd2a\",\n      \"broadcaster_id\": \"55696719\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"title\": \"Heads or Tails?\",\n      \"choices\": [\n        {\n          \"id\": \"4c123012-1351-4f33-84b7-43856e7a0f47\",\n          \"title\": \"Heads\",\n          \"votes\": 0,\n          \"channel_points_votes\": 0,\n          \"bits_votes\": 0\n        },\n        {\n          \"id\": \"279087e3-54a7-467e-bcd0-c1393fcea4f0\",\n          \"title\": \"Tails\",\n          \"votes\": 0,\n          \"channel_points_votes\": 0,\n          \"bits_votes\": 0\n        }\n      ],\n      \"bits_voting_enabled\": false,\n      \"bits_per_vote\": 0,\n      \"channel_points_voting_enabled\": false,\n      \"channel_points_per_vote\": 0,\n      \"status\": \"ACTIVE\",\n      \"duration\": 1800,\n      \"started_at\": \"2021-03-19T06:08:33.871278372Z\"\n    }\n  ],\n  \"pagination\": {}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create Poll

    \n \n \n

    NEW Create a poll for a specific Twitch channel.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:polls\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/polls

    \n\n

    Required Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster running polls. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    titlestringQuestion displayed for the poll.

    Maximum: 60 characters.
    choicesobject[]Array of the poll choices.

    Minimum: 2 choices. Maximum: 5 choices.
    choice.titlestringText displayed for the choice.

    Maximum: 25 characters.
    durationintegerTotal duration for the poll (in seconds).

    Minimum: 15. Maximum: 1800.
    \n\n

    Optional Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    bits_voting_enabledbooleanIndicates if Bits can be used for voting.

    Default: false\n
    bits_per_voteintegerNumber of Bits required to vote once with Bits.

    Minimum: 0. Maximum: 10000.
    channel_points_voting_enabledbooleanIndicates if Channel Points can be used for voting.

    Default: false\n
    channel_points_per_voteintegerNumber of Channel Points required to vote once with Channel Points.

    Minimum: 0. Maximum: 1000000.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the poll.
    broadcaster_idstringID of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    titlestringQuestion displayed for the poll.
    choicesobject[]Array of the poll choices.
    choice.idstringID for the choice.
    choice.titlestringText displayed for the choice.
    choice.votesintegerTotal number of votes received for the choice.
    choice.channel_points_votesintegerNumber of votes received via Channel Points.
    choice.bits_votesintegerNumber of votes received via Bits.
    bits_voting_enabledbooleanIndicates if Bits can be used for voting.
    bits_per_voteintegerNumber of Bits required to vote once with Bits.
    channel_points_voting_enabledbooleanIndicates if Channel Points can be used for voting.
    channel_points_per_voteintegerNumber of Channel Points required to vote once with Channel Points.
    statusstringPoll status. Valid values are:

    ACTIVE: Poll is currently in progress.

    COMPLETED: Poll has reached its ended_at time.

    TERMINATED: Poll has been manually terminated before its ended_at time.

    ARCHIVED: Poll is no longer visible on the channel.

    MODERATED: Poll is no longer visible to any user on Twitch.

    INVALID: Something went wrong determining the state.
    durationintegerTotal duration for the poll (in seconds).
    started_atstringUTC timestamp for the poll’s start time.
    ended_atstringUTC timestamp for the poll’s end time. Set to null if the poll is active.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Poll created successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns information for a specific poll created for the TwitchDev channel.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/polls' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n  \"broadcaster_id\":\"141981764\",\n  \"title\":\"Heads or Tails?\",\n  \"choices\":[{\n    \"title\":\"Heads\"\n  },\n  {\n    \"title\":\"Tails\"\n  }],\n  \"channel_points_voting_enabled\":true,\n  \"channel_points_per_vote\":100,\n  \"duration\":1800\n}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"ed961efd-8a3f-4cf5-a9d0-e616c590cd2a\",\n      \"broadcaster_id\": \"141981764\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"title\": \"Heads or Tails?\",\n      \"choices\": [\n        {\n          \"id\": \"4c123012-1351-4f33-84b7-43856e7a0f47\",\n          \"title\": \"Heads\",\n          \"votes\": 0,\n          \"channel_points_votes\": 0,\n          \"bits_votes\": 0\n        },\n        {\n          \"id\": \"279087e3-54a7-467e-bcd0-c1393fcea4f0\",\n          \"title\": \"Tails\",\n          \"votes\": 0,\n          \"channel_points_votes\": 0,\n          \"bits_votes\": 0\n        }\n      ],\n      \"bits_voting_enabled\": false,\n      \"bits_per_vote\": 0,\n      \"channel_points_voting_enabled\": true,\n      \"channel_points_per_vote\": 100,\n      \"status\": \"ACTIVE\",\n      \"duration\": 1800,\n      \"started_at\": \"2021-03-19T06:08:33.871278372Z\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    End Poll

    \n \n \n

    NEW End a poll that is currently active.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:polls\n
    • \n
    \n\n

    URL

    \n\n

    PATCH https://api.twitch.tv/helix/polls

    \n\n

    Required Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster running polls. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    idstringID of the poll.
    statusstringThe poll status to be set. Valid values:

    TERMINATED: End the poll manually, but allow it to be viewed publicly.

    ARCHIVED: End the poll manually and do not allow it to be viewed publicly.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the poll.
    broadcaster_idstringID of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    titlestringQuestion displayed for the poll.
    choicesobject[]Array of the poll choices.
    choice.idstringID for the choice.
    choice.titlestringText displayed for the choice.
    choice.votesintegerTotal number of votes received for the choice.
    choice.channel_points_votesintegerNumber of votes received via Channel Points.
    choice.bits_votesintegerNumber of votes received via Bits.
    bits_voting_enabledbooleanIndicates if Bits can be used for voting.
    bits_per_voteintegerNumber of Bits required to vote once with Bits.
    channel_points_voting_enabledbooleanIndicates if Channel Points can be used for voting.
    channel_points_per_voteintegerNumber of Channel Points required to vote once with Channel Points.
    statusstringPoll Status. Valid values are:

    ACTIVE: Poll is currently in progress.

    COMPLETED: Poll has reached its ended_at time.

    TERMINATED: Poll has been manually terminated before its ended_at time.

    ARCHIVED: Poll is no longer visible on the channel.

    MODERATED: Poll is no longer visible to any user on Twitch.

    INVALID: Something went wrong determining the state.
    durationintegerTotal duration for the poll (in seconds).
    started_atstringUTC timestamp for the poll’s start time.
    ended_atstringUTC timestamp for the poll’s end time.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Poll ended successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Ends a specific poll for the TwitchDev channel, but allows the results to be visible for viewers.

    \n\n
    curl -X PATCH 'https://api.twitch.tv/helix/polls' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n  \"broadcaster_id\":\"141981764\",\n  \"id\":\"ed961efd-8a3f-4cf5-a9d0-e616c590cd2a\",\n  \"status\":\"TERMINATED\"\n}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"ed961efd-8a3f-4cf5-a9d0-e616c590cd2a\",\n      \"broadcaster_id\": \"141981764\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"title\": \"Heads or Tails?\",\n      \"choices\": [\n        {\n          \"id\": \"4c123012-1351-4f33-84b7-43856e7a0f47\",\n          \"title\": \"Heads\",\n          \"votes\": 0,\n          \"channel_points_votes\": 0,\n          \"bits_votes\": 0\n        },\n        {\n          \"id\": \"279087e3-54a7-467e-bcd0-c1393fcea4f0\",\n          \"title\": \"Tails\",\n          \"votes\": 0,\n          \"channel_points_votes\": 0,\n          \"bits_votes\": 0\n        }\n      ],\n      \"bits_voting_enabled\": false,\n      \"bits_per_vote\": 0,\n      \"channel_points_voting_enabled\": true,\n      \"channel_points_per_vote\": 100,\n      \"status\": \"TERMINATED\",\n      \"duration\": 1800,\n      \"started_at\": \"2021-03-19T06:08:33.871278372Z\",\n      \"ended_at\": \"2021-03-19T06:11:26.746889614Z\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Predictions

    \n \n \n

    NEW Get information about all Channel Points Predictions or specific Channel Points Predictions for a Twitch channel. Results are ordered by most recent, so it can be assumed that the currently active or locked Prediction will be the first item.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:read:predictions\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/predictions

    \n\n

    Pagination Support

    \n\n

    Forward pagination.

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster running Predictions. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of a Prediction. Filters results to one or more specific Predictions. Not providing one or more IDs will return the full list of Predictions for the authenticated channel.

    Maximum: 100
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firststringMaximum number of objects to return.

    Maximum: 20. Default: 20.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the Prediction.
    broadcaster_idstringID of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    titlestringTitle for the Prediction.
    winning_outcome_idstringID of the winning outcome. If the status is ACTIVE, this is set to null.
    outcomesobject[]Array of possible outcomes for the Prediction.
    outcome.idstringID for the outcome.
    outcome.titlestringText displayed for outcome.
    outcome.usersintegerNumber of unique uesrs that chose the outcome.
    outcome.channel_pointsintegerNumber of Channel Points used for the outcome.
    outcome.top_predictorsobject[]Array of users who were the top predictors. null if none.
    outcome.top_predictors.user.idstringID of the user.
    outcome.top_predictors.user.namestringDisplay name of the user.
    outcome.top_predictors.user.loginstringLogin of the user.
    outcome.top_predictors.user.channel_points_usedintegerNumber of Channel Points used by the user.
    outcome.top_predictors.user.channel_points_wonintegerNumber of Channel Points won by the user.
    outcome.colorstringColor for the outcome. Valid values: BLUE, PINK\n
    prediction_windowintegerTotal duration for the Prediction (in seconds).
    statusstringStatus of the Prediction. Valid values are:

    RESOLVED: A winning outcome has been chosen and the Channel Points have been distributed to the users who guessed the correct outcome.

    ACTIVE: The Prediction is active and viewers can make predictions.

    CANCELED: The Prediction has been canceled and the Channel Points have been refunded to participants.

    LOCKED: The Prediction has been locked and viewers can no longer make predictions.
    created_atstringUTC timestamp for the Prediction’s start time.
    ended_atstringUTC timestamp for when the Prediction ended. If the status is ACTIVE, this is set to null.
    locked_atstringUTC timestamp for when the Prediction was locked. If the status is not LOCKED, this is set to null.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Prediction details returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Returns information for a specific Prediction created for the TwitchDev channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/predictions?broadcaster_id=55696719&id=d6676d5c-c86e-44d2-bfc4-100fb48f0656' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"d6676d5c-c86e-44d2-bfc4-100fb48f0656\",\n      \"broadcaster_id\": \"55696719\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"title\": \"Will there be any leaks today?\",\n      \"winning_outcome_id\": null,\n      \"outcomes\": [\n        {\n          \"id\": \"021e9234-5893-49b4-982e-cfe9a0aaddd9\",\n          \"title\": \"Yes\",\n          \"users\": 0,\n          \"channel_points\": 0,\n          \"top_predictors\": null,\n          \"color\": \"BLUE\"\n        },\n        {\n          \"id\": \"ded84c26-13cb-4b48-8cb5-5bae3ec3a66e\",\n          \"title\": \"No\",\n          \"users\": 0,\n          \"channel_points\": 0,\n          \"top_predictors\": null,\n          \"color\": \"PINK\"\n        }\n      ],\n      \"prediction_window\": 600,\n      \"status\": \"ACTIVE\",\n      \"created_at\": \"2021-04-28T16:03:06.320848689Z\",\n      \"ended_at\": null,\n      \"locked_at\": null\n    }\n  ],\n  \"pagination\": {}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create Prediction

    \n \n \n

    NEW Create a Channel Points Prediction for a specific Twitch channel.

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:predictions\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/predictions

    \n\n

    Required Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster running Predictions. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    titlestringTitle for the Prediction.

    Maximum: 45 characters.
    outcomesobject[]Array of outcome objects with titles for the Prediction. Array size must be 2. The first outcome object is the “blue” outcome and the second outcome object is the “pink” outcome when viewing the Prediction on Twitch.
    outcome.titlestringText displayed for the outcome choice.

    Maximum: 25 characters.
    prediction_windowintegerTotal duration for the Prediction (in seconds).

    Minimum: 1. Maximum: 1800.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the Prediction.
    broadcaster_idstringID of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    titlestringTitle for the Prediction.
    winning_outcome_idstringID of the winning outcome.
    outcomesobject[]Array of possible outcomes for the Prediction.
    outcome.idstringID for the outcome.
    outcome.titlestringText displayed for outcome.
    outcome.usersintegerNumber of unique uesrs that chose the outcome.
    outcome.channel_pointsintegerNumber of Channel Points used for the outcome.
    outcome.colorstringColor for the outcome. Valid values: BLUE, PINK\n
    outcome.top_predictorsobject[]Array of users who were the top predictors.
    outcome.top_predictors.user.idstringID of the user.
    outcome.top_predictors.user.namestringDisplay name of the user.
    outcome.top_predictors.user.loginstringLogin of the user.
    outcome.top_predictors.user.channel_points_usedintegerNumber of Channel Points used by the user.
    outcome.top_predictors.user.channel_points_wonintegerNumber of Channel Points won by the user.
    prediction_windowintegerTotal duration for the Prediction (in seconds).
    statusstringStatus of the Prediction. Valid values are:

    RESOLVED: A winning outcome has been chosen and the Channel Points have been distributed to the users who predicted the correct outcome.

    ACTIVE: The Prediction is active and viewers can make predictions.

    CANCELED: The Prediction has been canceled and the Channel Points have been refunded to participants.

    LOCKED: The Prediction has been locked and viewers can no longer make predictions.
    created_atstringUTC timestamp for the Prediction’s start time.
    ended_atstringUTC timestamp for when the Prediction ended. If the status is ACTIVE, this is set to null.
    locked_atstringUTC timestamp for when the Prediction was locked. If the status is not LOCKED, this is set to null.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Prediction created successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Creates a Prediction for the TwitchDev channel.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/predictions' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-H 'Content-Type: application/json' \\\n-d '{\n  \"broadcaster_id\": \"141981764\",\n  \"title\": \"Any leeks in the stream?\",\n  \"outcomes\": [\n    {\n      \"title\": \"Yes, give it time.\"\n    },\n    {\n      \"title\": \"Definitely not.\"\n    }\n  ],\n  \"prediction_window\": 120,\n}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"bc637af0-7766-4525-9308-4112f4cbf178\",\n      \"broadcaster_id\": \"141981764\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"title\": \"Any leeks in the stream?\",\n      \"winning_outcome_id\": null,\n      \"outcomes\": [\n        {\n          \"id\": \"73085848-a94d-4040-9d21-2cb7a89374b7\",\n          \"title\": \"Yes, give it time.\",\n          \"users\": 0,\n          \"channel_points\": 0,\n          \"top_predictors\": null,\n          \"color\": \"BLUE\"\n        },\n        {\n          \"id\": \"906b70ba-1f12-47ea-9e95-e5f93d20e9cc\",\n          \"title\": \"Definitely not.\",\n          \"users\": 0,\n          \"channel_points\": 0,\n          \"top_predictors\": null,\n          \"color\": \"PINK\"\n        }\n      ],\n      \"prediction_window\": 120,\n      \"status\": \"ACTIVE\",\n      \"created_at\": \"2021-04-28T17:11:22.595914172Z\",\n      \"ended_at\": null,\n      \"locked_at\": null\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    End Prediction

    \n \n \n

    NEW Lock, resolve, or cancel a Channel Points Prediction. Active Predictions can be updated to be “locked,” “resolved,” or “canceled.” Locked Predictions can be updated to be “resolved” or “canceled.”

    \n\n

    Authorization

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:predictions\n
    • \n
    \n\n

    URL

    \n\n

    PATCH https://api.twitch.tv/helix/predictions

    \n\n

    Required Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringThe broadcaster running prediction events. Provided broadcaster_id must match the user_id in the user OAuth token.

    Maximum: 1
    idstringID of the Prediction.
    statusstringThe Prediction status to be set. Valid values:

    RESOLVED: A winning outcome has been chosen and the Channel Points have been distributed to the users who predicted the correct outcome.

    CANCELED: The Prediction has been canceled and the Channel Points have been refunded to participants.

    LOCKED: The Prediction has been locked and viewers can no longer make predictions.
    \n\n

    Optional Body Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    winning_outcome_idstringID of the winning outcome for the Prediction. This parameter is required if status is being set to RESOLVED.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    idstringID of the prediction.
    broadcaster_idstringID of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    broadcaster_namestringName of the broadcaster.
    titlestringTitle for the prediction.
    winning_outcome_idstringID of the winning outcome.
    outcomesobject[]Array of possible outcomes for the prediction.
    outcome.idstringID for the outcome.
    outcome.titlestringText displayed for outcome.
    outcome.usersintegerNumber of unique uesrs that chose the outcome.
    outcome.channel_pointsintegerNumber of Channel Points used for the outcome.
    outcome.colorstringColor for the outcome. Valid values: BLUE, PINK\n
    outcome.top_predictorsobject[]Array of users who were the top predictors.
    outcome.top_predictors.user.idstringID of the user.
    outcome.top_predictors.user.namestringDisplay name of the user.
    outcome.top_predictors.user.loginstringLogin of the user.
    outcome.top_predictors.user.channel_points_usedintegerNumber of Channel Points used by the user.
    outcome.top_predictors.user.channel_points_wonintegerNumber of Channel Points won by the user.
    prediction_windowintegerTotal duration for the prediction (in seconds).
    statusstringStatus of the prediction. Valid values are:

    RESOLVED: A winning outcome has been chosen and the Channel Points have been distributed to the users who predicted the correct outcome.

    ACTIVE: The Prediction is active and viewers can make predictions.

    CANCELED: The Prediction has been canceled and the Channel Points have been refunded to participants.

    LOCKED: The Prediction has been locked and viewers can no longer make predictions.
    created_atstringUTC timestamp for the prediction’s start time.
    ended_atstringUTC timestamp for when the prediction ended. If the status is ACTIVE, this is set to null.
    locked_atstringUTC timestamp for when the prediction was locked. If the status is not LOCKED, this is set to null.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Prediction ended successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Ends a specific Prediction for the TwitchDev channel by setting the status to be resolved.

    \n\n
    curl -X PATCH 'https://api.twitch.tv/helix/predictions' \\ -H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\ -H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\ -H 'Content-Type: application/json' \\ -d  '{\n  \"broadcaster_id\": \"141981764\",\n  \"id\": \"bc637af0-7766-4525-9308-4112f4cbf178\",\n  \"status\": \"RESOLVED\",\n  \"winning_outcome_id\": \"73085848-a94d-4040-9d21-2cb7a89374b7\"\n}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"bc637af0-7766-4525-9308-4112f4cbf178\",\n      \"broadcaster_id\": \"141981764\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"title\": \"Will we win all the games?\",\n      \"winning_outcome_id\": \"73085848-a94d-4040-9d21-2cb7a89374b7\",\n      \"outcomes\": [\n        {\n          \"id\": \"73085848-a94d-4040-9d21-2cb7a89374b7\",\n          \"title\": \"yes\",\n          \"users\": 0,\n          \"channel_points\": 0,\n          \"top_predictors\": null,\n          \"color\": \"BLUE\"\n        },\n        {\n          \"id\": \"86010b2e-9764-4136-9359-fd1c9c5a8033\",\n          \"title\": \"no\",\n          \"users\": 0,\n          \"channel_points\": 0,\n          \"top_predictors\": null,\n          \"color\": \"PINK\"\n        }\n      ],\n      \"prediction_window\": 120,\n      \"status\": \"RESOLVED\",\n      \"created_at\": \"2021-04-28T21:48:19.480371331Z\",\n      \"ended_at\": \"2021-04-28T21:54:24.026833954Z\",\n      \"locked_at\": \"2021-04-28T21:48:34.636685705Z\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Search Categories

    \n \n \n

    Returns a list of games or categories that match the query via name either entirely or partially.

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/search/categories 

    \n\n

    Pagination Support

    \n\n

    Forward pagination only.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    querystringURl encoded search query
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParamaterTypeDescription
    firstintegerMaximum number of objects to return.
    Maximum: 100.
    Default: 20.
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    box_art_urlstringTemplate URL for the game’s box art.
    namestringGame/category name.
    idstringGame/category ID.
    \n\n

    Note: The return values are the same as returned from GET https://api.twitch.tv/helix/games

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request queries for games and categories.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/search/categories?query=fort' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    {\n    \"data\": [{\n        \"id\": \"33214\",\n        \"name\": \"Fortnite\",\n        \"box_art_url\": \"https://static-cdn.jtvnw.net/ttv-boxart/Fortnite-{width}x{height}.jpg\"\n    },\n      ...],\n    \"pagination\": {\n        \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN\"\n    }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Search Channels

    \n \n \n

    Returns a list of channels (users who have streamed within the past 6 months) that match the query via channel name or description either entirely or partially. Results include both live and offline channels. Online channels will have additional metadata (e.g. started_at, tag_ids).

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required

    \n\n

    Pagination Support

    \n\n

    Forward only.

    \n\n

    URL

    \n\n

    GET helix/search/channels

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    querystringURl encoded search query
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    firstintegerMaximum number of objects to return.
    Maximum: 100
    Default: 20
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    live_onlyBooleanFilter results for live streams only.
    Default: false
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_languagestringChannel language
    (Broadcaster Language field from the Channels service). A language value is either the ISO 639-1 two-letter code for a supported stream language or “other”.
    broadcaster_loginstringLogin of the broadcaster.
    display_namestringDisplay name of the broadcaster.
    game_idstringID of the game being played on the stream.
    game_namestringName of the game being played on the stream.
    idstringChannel ID.
    is_liveBooleanIndicates if the channel is currenty live.
    tag_idsstring[]Tag IDs that apply to the stream. This array only contains strings when a channel is live. For all possibilities, see List of All Tags. Category Tags are not returned.
    thumbnail_urlstringThumbnail URL of the stream. All image URLs have variable width and height. You can replace {width} and {height} with any values to get that size image.
    titlestringStream title.
    started_atstringUTC timestamp. Returns an empty string if the channel is not live.
    \n\n \n
    \n\n \n
    \n \n

    Example Requests

    \n

    This example searches for channels:

    \n
    curl -X GET 'https://api.twitch.tv/helix/search/channels?query=loserfruit' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    This example searches for live channels:

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/search/channels?query=a_seagull' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n

    Example Responses

    \n\n

    Search for channels response:

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_language\": \"en\",\n      \"broadcaster_login\": \"loserfruit\",\n      \"display_name\": \"Loserfruit\",\n      \"game_id\": \"498000\",\n      \"game_name\": \"House Flipper\",\n      \"id\": \"41245072\",\n      \"is_live\": false,\n      \"tag_ids\": [],\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/fd17325a-7dc2-46c6-8617-e90ec259501c-profile_image-300x300.png\",\n      \"title\": \"loserfruit\",\n      \"started_at\": \"\"\n    },\n... ],\n  \"pagination\": {\n    \"cursor\": \"Mg==\"\n  }\n}\n
    \n\n

    Search for live channels response:

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_language\": \"en\",\n      \"broadcaster_login\": \"a_seagull\",\n      \"display_name\": \"A_Seagull\",\n      \"game_id\": \"506442\",\n      \"game_name\": \"DOOM Eternal\",\n      \"id\": \"19070311\",\n      \"is_live\": true,\n      \"tags_ids\": [\n        \"6ea6bca4-4712-4ab9-a906-e3336a9d8039\"\n      ],\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/a_seagull-profile_image-4d2d235688c7dc66-300x300.png\",\n      \"title\": \"a_seagull\",\n      \"started_at\": \"2020-03-18T17:56:00Z\"\n    }\n  ],\n  \"pagination\": {}\n}\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Stream Key

    \n \n \n

    Gets the channel stream key for a user.

    \n\n

    Authentication

    \n\n
      \n
    • \n

      User OAuth token

      \n
    • \n
    • \n

      Required scope: channel:read:stream_key

      \n
    • \n
    \n\n

    URL

    \n\n

    https://api.twitch.tv/helix/streams/key

    \n\n

    Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterRequiredTypeDescription
    broadcaster_idyesstringUser ID of the broadcaster
    \n\n

    Response Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterType Description
    stream_keystringStream key for the channel
    \n\n

    Possible Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP CodeMeaning
    200Channel/Stream information returned successfully
    401Authentication failure
    500Internal Server Error, Failed to get channel information
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/streams/key' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"stream_key\": \"live_44322889_a34ub37c8ajv98a0\"\n    },\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Streams

    \n \n \n

    Gets information about active streams. Streams are returned sorted by number of current viewers, in descending order. Across multiple pages of results, there may be duplicate or missing streams, as viewers join and leave streams.

    \n\n

    The response has a JSON payload with a data field containing an array of stream information elements and a pagination field containing information required to query for more streams.

    \n\n

    Authentication

    \n\n

    OAuth or App Access Token required

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/streams

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    beforestringCursor for backward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    game_idstringReturns streams broadcasting a specified game ID. You can specify up to 100 IDs.
    languagestringStream language. You can specify up to 100 languages. A language value must be either the ISO 639-1 two-letter code for a supported stream language or “other”.
    user_idstringReturns streams broadcast by one or more specified user IDs. You can specify up to 100 IDs.
    user_loginstringReturns streams broadcast by one or more specified user login names. You can specify up to 100 names.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    idstringStream ID.
    user_idstringID of the user who is streaming.
    user_loginstringLogin of the user who is streaming.
    user_namestringDisplay name corresponding to user_id.
    game_idstringID of the game being played on the stream.
    game_namestringName of the game being played.
    typestringStream type: \"live\" or \"\" (in case of error).
    titlestringStream title.
    viewer_countintNumber of viewers watching the stream at the time of the query.
    started_atstringUTC timestamp.
    languagestringStream language. A language value is either the ISO 639-1 two-letter code for a supported stream language or “other”.
    thumbnail_urlstringThumbnail URL of the stream. All image URLs have variable width and height. You can replace {width} and {height} with any values to get that size image
    tag_idsstringShows tag IDs that apply to the stream.
    is_maturebooleanIndicates if the broadcaster has specified their channel contains mature content that may be inappropriate for younger audiences.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    \n\n \n
    \n\n \n
    \n \n

    Example Request #1

    \n\n

    This gets information about the 20 most active streams.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/streams' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response 1

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"41375541868\",\n      \"user_id\": \"459331509\",\n      \"user_login\": \"auronplay\",\n      \"user_name\": \"auronplay\",\n      \"game_id\": \"494131\",\n      \"game_name\": \"Little Nightmares\",\n      \"type\": \"live\",\n      \"title\": \"hablamos y le damos a Little Nightmares 1\",\n      \"viewer_count\": 78365,\n      \"started_at\": \"2021-03-10T15:04:21Z\",\n      \"language\": \"es\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/previews-ttv/live_user_auronplay-{width}x{height}.jpg\",\n      \"tag_ids\": [\n        \"d4bb9c58-2141-4881-bcdc-3fe0505457d1\"\n      ],\n      \"is_mature\": false\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjp7IkN1cnNvciI6ImV5SnpJam8zT0RNMk5TNDBORFF4TlRjMU1UY3hOU3dpWkNJNlptRnNjMlVzSW5RaU9uUnlkV1Y5In0sImEiOnsiQ3Vyc29yIjoiZXlKeklqb3hOVGs0TkM0MU56RXhNekExTVRZNU1ESXNJbVFpT21aaGJITmxMQ0owSWpwMGNuVmxmUT09In19\"\n  }\n}\n
    \n\n

    Example Request 2

    \n\n

    This gets information about the next 20 most active streams, after the ones specified in the prior response. The request includes as its after value, the cursor returned in the prior response.

    \n\n
    curl -X GET\n'https://api.twitch.tv/helix/streams?first=20&after=eyJiIjp7IkN1cnNvciI6ImV5SnpJam8zT0RNMk5TNDBORFF4TlRjMU1UY3hOU3dpWkNJNlptRnNjMlVzSW5RaU9uUnlkV1Y5In0sImEiOnsiQ3Vyc29yIjoiZXlKeklqb3hOVGs0TkM0MU56RXhNekExTVRZNU1ESXNJbVFpT21aaGJITmxMQ0owSWpwMGNuVmxmUT09In19' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response 2

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"40944942733\",\n      \"user_id\": \"67931625\",\n      \"user_login\": \"amar\",\n      \"user_name\": \"Amar\",\n      \"game_id\": \"33214\",\n      \"game_name\": \"Fortnite\",\n      \"type\": \"live\",\n      \"title\": \"27h Stream Pringles Deathrun Map + 12k MK Turnier | !sub !JustLegends !Pc !yfood\",\n      \"viewer_count\": 14944,\n      \"started_at\": \"2021-03-09T16:59:39Z\",\n      \"language\": \"de\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/previews-ttv/live_user_amar-{width}x{height}.jpg\",\n      \"tag_ids\": [\n        \"9166ad14-41f1-4b04-a3b8-c8eb838c6be6\"\n      ],\n      \"is_mature\": false\n    },\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjp7IkN1cnNvciI6ImV5SnpJam94TkRrME5DNDFOekV5TXpBMU1UWTVNRElzSW1RaU9tWmhiSE5sTENKMElqcDBjblZsZlE9PSJ9LCJhIjp7IkN1cnNvciI6ImV5SnpJam81TlRFMkxqVTNOREF6TmpNNU9UTXpNaXdpWkNJNlptRnNjMlVzSW5RaU9uUnlkV1Y5In19\"\n  }\n}\n
    \n\n

    Example Request 3

    \n\n

    This gets information about three different specified streams using the ability to pass multiple logins. If a provided user is not live, they will not be included in the response.

    \n\n
    curl -X GET\n'https://api.twitch.tv/helix/streams?user_login=afro&user_login=cohhcarnage&user_login=lana_lux' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response 3

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"40952121085\",\n      \"user_id\": \"101051819\",\n      \"user_login\": \"afro\",\n      \"user_name\": \"Afro\",\n      \"game_id\": \"32982\",\n      \"game_name\": \"Grand Theft Auto V\",\n      \"type\": \"live\",\n      \"title\": \"Jacob: Digital Den Laptops & Routers | NoPixel | !MAINGEAR !FCF\",\n      \"viewer_count\": 1490,\n      \"started_at\": \"2021-03-10T03:18:11Z\",\n      \"language\": \"en\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/previews-ttv/live_user_afro-{width}x{height}.jpg\",\n      \"tag_ids\": [\n        \"6ea6bca4-4712-4ab9-a906-e3336a9d8039\"\n      ],\n      \"is_mature\": false\n    },\n    ...\n  ],\n  \"pagination\": {}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Followed Streams

    \n \n \n

    Gets information about active streams belonging to channels that the authenticated user follows. Streams are returned sorted by number of current viewers, in descending order. Across multiple pages of results, there may be duplicate or missing streams, as viewers join and leave streams.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth user token required
    • \n
    • Required scope: user:read:follows\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/streams/followed

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringResults will only include active streams from the channels that this Twitch user follows. user_id must match the User ID in the bearer token.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 100.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    game_idstringID of the game being played on the stream.
    game_namestringName of the game being played.
    idstringStream ID.
    languagestringStream language. A language value is either the ISO 639-1 two-letter code for a supported stream language or “other”.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    started_atstringUTC timestamp.
    tag_idsstringShows tag IDs that apply to the stream.
    thumbnail_urlstringThumbnail URL of the stream. All image URLs have variable width and height. You can replace {width} and {height} with any values to get that size image
    titlestringStream title.
    typestringStream type: \"live\" or \"\" (in case of error).
    user_idstringID of the user who is streaming.
    user_loginstringLogin of the user who is streaming.
    user_namestringDisplay name corresponding to user_id.
    viewer_countintNumber of viewers watching the stream at the time of the query.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Retrieves the active streams for the channels that the TwitchDev user follows.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/streams/followed?user_id=141981764' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"42170724654\",\n      \"user_id\": \"132954738\",\n      \"user_login\": \"aws\",\n      \"user_name\": \"AWS\",\n      \"game_id\": \"417752\",\n      \"game_name\": \"Talk Shows & Podcasts\",\n      \"type\": \"live\",\n      \"title\": \"AWS Howdy Partner! Y'all welcome ExtraHop to the show!\",\n      \"viewer_count\": 20,\n      \"started_at\": \"2021-03-31T20:57:26Z\",\n      \"language\": \"en\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/previews-ttv/live_user_aws-{width}x{height}.jpg\",\n      \"tag_ids\": [\n        \"6ea6bca4-4712-4ab9-a906-e3336a9d8039\"\n      ]\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjp7IkN1cnNvciI6ImV5SnpJam8zT0RNMk5TNDBORFF4TlRjMU1UY3hOU3dpWkNJNlptRnNjMlVzSW5RaU9uUnlkV1Y5In0sImEiOnsiQ3Vyc29yIjoiZXlKeklqb3hOVGs0TkM0MU56RXhNekExTVRZNU1ESXNJbVFpT21aaGJITmxMQ0owSWpwMGNuVmxmUT09In19\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create Stream Marker

    \n \n \n

    Creates a marker in the stream of a user specified by user ID. A marker is an arbitrary point in a stream that the broadcaster wants to mark; e.g., to easily return to later. The marker is created at the current timestamp in the live broadcast when the request is processed. Markers can be created by the stream owner or editors. The user creating the marker is identified by a Bearer token.

    \n\n

    Markers cannot be created in some cases (an error will occur):

    \n\n
      \n
    • If the specified user’s stream is not live.
    • \n
    • If VOD (past broadcast) storage is not enabled for the stream.
    • \n
    • For premieres (live, first-viewing events that combine uploaded videos with live chat).
    • \n
    • For reruns (subsequent (not live) streaming of any past broadcast, including past premieres).
    • \n
    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: channel:manage:broadcast\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/streams/markers

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Required Body Parameter

    \n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeParameter
    user_idstring

    ID of the broadcaster in whose live stream the marker is created.

    \n\n

    Optional Body Parameter

    \n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeParameter
    descriptionstringDescription of or comments on the marker. Max length is 140 characters.
    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    created_atstringRFC3339 timestamp of the marker.
    descriptionstringDescription of the marker.
    idstringUnique ID of the marker.
    position_secondsintegerRelative offset (in seconds) of the marker, from the beginning of the stream.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This creates a marker at the current location in user 123’s stream.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/streams/markers' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-H 'Content-Type: application/json' \\\n-d '{\"user_id\":\"123\", \"description\":\"hello, this is a marker!\"}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n     {\n        \"id\": 123,\n        \"created_at\": \"2018-08-20T20:10:03Z\",\n        \"description\": \"hello, this is a marker!\",\n        \"position_seconds\": 244\n     }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Stream Markers

    \n \n \n

    Gets a list of markers for either a specified user’s most recent stream or a specified VOD/video (stream), ordered by recency. A marker is an arbitrary point in a stream that the broadcaster wants to mark; e.g., to easily return to later. The only markers returned are those created by the user identified by the Bearer token.

    \n\n

    The response has a JSON payload with a data field containing an array of marker information elements and a pagination field containing information required to query for more follow information.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: user:read:broadcast\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/streams/markers

    \n\n

    Required Query Parameter

    \n\n

    Only one of user_id and video_id must be specified.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    user_idstringID of the broadcaster from whose stream markers are returned.
    video_idstring

    ID of the VOD/video whose stream markers are returned.

    \n\n

    Optional Query Parameters

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    beforestringCursor for backward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firststring

    Number of values to be returned when getting videos by user or game ID. Limit: 100. Default: 20.

    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    idstringID of the marker.
    created_atstringRFC3339 timestamp of the marker.
    descriptionstringDescription of the marker.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results. If this is empty, you are at the last page.
    position_secondsintegerRelative offset (in seconds) of the marker, from the beginning of the stream.
    URLstringA link to the stream with a query parameter that is a timestamp of the marker's location.
    user_idstringID of the user whose markers are returned.
    user_namestringDisplay name corresponding to user_id.
    user_loginstringLogin corresponding to user_id.
    video_idstringID of the stream (VOD/video) that was marked.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This returns the first 5 markers in the most recent stream of user 123.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/streams/markers?user_id=123&first=5' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"user_id\": \"123\",\n      \"user_name\": \"TwitchName\",\n      \"user_login\": \"twitchname\",\n      \"videos\": [\n        {\n          \"video_id\": \"456\",\n          \"markers\": [\n            {\n              \"id\": \"106b8d6243a4f883d25ad75e6cdffdc4\",\n              \"created_at\": \"2018-08-20T20:10:03Z\",\n              \"description\": \"hello, this is a marker!\",\n              \"position_seconds\": 244,\n              \"URL\": \"https://twitch.tv/videos/456?t=0h4m06s\"\n            },\n            ...\n          ]\n        }\n      ]\n    }\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjoiMjk1MjA0Mzk3OjI1Mzpib29rbWFyazoxMDZiOGQ1Y\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Broadcaster Subscriptions

    \n \n \n

    Description

    \n\n

    Get all of the subscriptions for a specific broadcaster.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: channel:read:subscriptions\n
    • \n
    \n\n

    Subscriptions can be requested on behalf of a broadcaster with a user access token or by a Twitch Extension with an app access token if the broadcaster has granted the channel:read:subscriptions scope from within the Twitch Extensions manager.

    \n\n

    Pagination support

    \n\n

    Forward only

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/subscriptions

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringUser ID of the broadcaster. Must match the User ID in the Bearer token.
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    user_idstringFilters results to only include potential subscriptions made by the provided user IDs. Accepts up to 100 values.
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results in a multi-page response. This applies only to queries without user_id. If a user_id is specified, it supersedes any cursor/offset combinations. The cursor value specified here is from the pagination response field of a prior query.
    firststringMaximum number of objects to return. Maximum: 100. Default: 20.
    \n\n

    Return Values

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringUser ID of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    broadcaster_namestringDisplay name of the broadcaster.
    gifter_idstringIf the subscription was gifted, this is the user ID of the gifter. Empty string otherwise.
    gifter_loginstringIf the subscription was gifted, this is the login of the gifter. Empty string otherwise.
    gifter_namestringIf the subscription was gifted, this is the display name of the gifter. Empty string otherwise.
    is_giftBoolean\ntrue if the subscription is a gift subscription.
    plan_namestringName of the subscription.
    tierstringType of subscription (Tier 1, Tier 2, Tier 3).
    1000 = Tier 1, 2000 = Tier 2, 3000 = Tier 3 subscriptions.
    user_idstringID of the subscribed user.
    user_namestringDisplay name of the subscribed user.
    user_loginstringLogin of the subscribed user.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results. If this is empty, you are at the last page.
    totalintegerThe number of Twitch users subscribed to the broadcaster.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/subscriptions?broadcaster_id=141981764' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_id\": \"141981764\",\n      \"broadcaster_login\": \"twitchdev\",\n      \"broadcaster_name\": \"TwitchDev\",\n      \"gifter_id\": \"12826\",\n      \"gifter_login\": \"twitch\",\n      \"gifter_name\": \"Twitch\",\n      \"is_gift\": true,\n      \"tier\": \"1000\",\n      \"plan_name\": \"Channel Subscription (twitchdev)\",\n      \"user_id\": \"527115020\",\n      \"user_name\": \"twitchgaming\",\n      \"user_login\": \"twitchgaming\"\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"xxxx\"\n  },\n  \"total\": 13\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Check User Subscription

    \n \n \n

    Checks if a specific user (user_id) is subscribed to a specific channel (broadcaster_id).

    \n

    Authentication

    \n\n
      \n
    • User access token with scope user:read:subscriptions\n
    • \n
    • App access token if the user has authorized your application with scope user:read:subscriptions\n
    • \n
    \n\n

    URL

    \n

    GET https://api.twitch.tv/helix/subscriptions/user

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringUser ID of an Affiliate or Partner broadcaster.
    user_idstringUser ID of a Twitch viewer.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    broadcaster_idstringUser ID of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    broadcaster_namestringDisplay name of the broadcaster.
    is_giftbooleanIndicates if the subscription is a gift.
    gifter_loginstringLogin of the gifter (if is_gift is true).
    gifter_namestringDisplay name of the gifter (if is_gift is true).
    tierstringSubscription tier. 1000 is tier 1, 2000 is tier 2, and 3000 is tier 3.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200User subscription returned successfully.
    400Request was invalid.
    401Authorization failed.
    404User not subscribed to the channel.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Checks if the user TwitchDev (141981764) subscribes to the TwitchPresents (149747285) channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/subscriptions/user?broadcaster_id=149747285&user_id=141981764' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response #1

    \n\n

    If TwitchDev does subscribe to the TwitchPresents channel.

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_id\": \"149747285\",\n      \"broadcaster_name\": \"TwitchPresents\",\n      \"broadcaster_login\": \"twitchpresents\",\n      \"is_gift\": false,\n      \"tier\": \"1000\"\n    }\n  ]\n}\n
    \n\n

    Example Response #2

    \n\n

    If TwitchDev does not subscribe to the TwitchPresents channel.

    \n\n
    {\n  \"error\": \"Not Found\",\n  \"message\": \"twitchdev has no subscription to twitchpresents\",\n  \"status\": 404\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get All Stream Tags

    \n \n \n

    Gets the list of all stream tags defined by Twitch, optionally filtered by tag ID(s).

    \n\n

    The response has a JSON payload with a data field containing an array of tag elements and a pagination field containing information required to query for more tags.

    \n\n

    Authentication

    \n\n

    App access token

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/tags/streams

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    tag_idstringID of a tag. Multiple IDs can be specified, separated by ampersands. If provided, only the specified tag(s) is(are) returned.

    Maximum of 100.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    tag_idstringID of the tag.
    is_autoBoolean\ntrue if the tag is auto-generated; otherwise, false . An auto-generated tag is one automatically applied by Twitch (e.g., a language tag based on the broadcaster’s settings); these tags cannot be added or removed by the user.
    localization_namesmap[string]stringAll localized names of the tag.
    localization_descriptionsmap[string]stringAll localized descriptions of the tag.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    Not supported when tag_id is provided.
    \n\n

     

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets the first page of stream tags defined by Twitch.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/tags/streams' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"tag_id\": \"621fb5bf-5498-4d8f-b4ac-db4d40d401bf\",\n      \"is_auto\": false,\n      \"localization_names\": {\n        \"bg-bg\": \"Изчистване на 1 кредит\",\n        \"cs-cz\": \"1 čistý kredit\",\n        \"da-dk\": \"1 credit klaret\",\n        \"de-de\": \"Mit 1 Leben abschließen\",\n        \"el-gr\": \"1 μόνο πίστωση\",\n        \"en-us\": \"1 Credit Clear\",\n        ...\n      },\n      \"localization_descriptions\": {\n        \"bg-bg\": \"За потоци с акцент върху завършване на аркадна игра с монети, в която не се използва продължаване\",\n        \"cs-cz\": \"Pro vysílání s důrazem na plnění mincových arkádových her bez použití pokračování.\",\n        \"da-dk\": \"Til streams med vægt på at gennemføre et arkadespil uden at bruge continues\",\n        \"de-de\": \"Für Streams mit dem Ziel, ein Coin-op-Arcade-Game mit nur einem Leben abzuschließen.\",\n        \"el-gr\": \"Για μεταδόσεις με έμφαση στην ολοκλήρωση παλαιού τύπου ηλεκτρονικών παιχνιδιών που λειτουργούν με κέρμα, χωρίς να χρησιμοποιούν συνέχειες\",\n        \"en-us\": \"For streams with an emphasis on completing a coin-op arcade game without using any continues\",\n        ...\n      }\n    },\n    ...\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiI...\"\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Stream Tags

    \n \n \n

    Gets the list of current stream tags that have been set for a channel.

    \n\n

    Authentication

    \n\n

    OAuth Token required.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/streams/tags

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringUser ID of the channel to get tags.
    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    tag_idstringID of the tag.
    is_autoBoolean\ntrue if the tag is auto-generated; otherwise, false . An auto-generated tag is one automatically applied by Twitch (e.g., a language tag based on the broadcaster’s settings); tags these cannot be added or removed by the user.
    localization_namesmap[string]stringAll localized names of the tag.
    localization_descriptionsmap[string]stringAll localized descriptions of the tag.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets the tags for the TwitchGaming channel.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/streams/tags?broadcaster_id=527115020' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"tag_id\": \"6ea6bca4-4712-4ab9-a906-e3336a9d8039\",\n      \"is_auto\": true,\n      \"localization_names\": {\n        \"bg-bg\": \"английски\",\n        \"cs-cz\": \"Angličtina\",\n        \"da-dk\": \"Engelsk\",\n        \"de-de\": \"Englisch\",\n        \"el-gr\": \"Αγγλικά\",\n        \"en-us\": \"English\",\n        ...\n      },\n      \"localization_descriptions\": {\n        \"bg-bg\": \"За потоци с използване на английски\",\n        \"cs-cz\": \"Pro vysílání obsahující angličtinu.\",\n        \"da-dk\": \"Til streams, hvori der indgår engelsk\",\n        \"de-de\": \"Für Streams auf Englisch.\",\n        \"el-gr\": \"Για μεταδόσεις που περιλαμβάνουν τη χρήση Αγγλικών\",\n        \"en-us\": \"For streams featuring the use of English\",\n        ...\n      }\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Replace Stream Tags

    \n \n \n

    Applies specified tags to a specified stream, overwriting any existing tags applied to that stream. If no tags are specified, all tags previously applied to the stream are removed. Automated tags are not affected by this operation.

    \n\n

    Tags expire 72 hours after they are applied, unless the stream is live within that time period. If the stream is live within the 72-hour window, the 72-hour clock restarts when the stream goes offline. The expiration period is subject to change.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: channel:manage:broadcast\n
    • \n
    \n\n

    URL

    \n\n

    PUT https://api.twitch.tv/helix/streams/tags

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringID of the stream for which tags are to be replaced.
    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Optional Body Parameter

    \n\n

    Up to five tags can be applied to a stream. If no tag_ids is provided, all tags are removed from the stream.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    tag_idsstring []IDs of tags to be applied to the stream.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This adds tags to broadcaster 257788195’s stream.

    \n\n
    curl -X PUT 'https://api.twitch.tv/helix/streams/tags?broadcaster_id=257788195' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-H 'Content-Type: application/json' \\\n-d '{\"tag_ids\":[\"621fb5bf-5498-4d8f-b4ac-db4d40d401bf\",\"79977fb9-f106-4a87-a386-f1b0f99783dd\"]}'\n
    \n\n

    Example Response

    \n\n
    204: No Content\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Channel Teams

    \n \n \n

    Retrieves a list of Twitch Teams of which the specified channel/broadcaster is a member.

    \n

    Authentication

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URL

    \n

    GET https://api.twitch.tv/helix/teams/channel

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringUser ID for a Twitch user.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    broadcaster_idstringUser ID of the broadcaster.
    broadcaster_loginstringLogin of the broadcaster.
    broadcaster_namestringDisplay name of the broadcaster.
    background_image_urlstringURL for the Team background image.
    bannerstringURL for the Team banner.
    created_atstringDate and time the Team was created.
    updated_atstringDate and time the Team was last updated.
    infostringTeam description.
    thumbnail_urlstringImage URL for the Team logo.
    team_namestringTeam name.
    team_display_namestringTeam display name.
    idstringTeam ID.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200List of Channel Teams returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    Retrieves a list of Twitch Teams that the broadcaster CSharpFritz belongs to.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/teams/channel?broadcaster_id=96909659' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_id\": \"96909659\",\n      \"broadcaster_name\": \"CSharpFritz\",\n      \"broadcaster_login\": \"csharpfritz\",\n      \"background_image_url\": null,\n      \"banner\": null,\n      \"created_at\": \"2019-02-11T12:09:22Z\",\n      \"updated_at\": \"2020-11-18T15:56:41Z\",\n      \"info\": \"<p>An outgoing and enthusiastic group of friendly channels that write code, teach about technology, and promote the technical community.</p>\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/team-livecoders-team_logo_image-bf1d9a87ca81432687de60e24ad9593d-600x600.png\",\n      \"team_name\": \"livecoders\",\n      \"team_display_name\": \"Live Coders\",\n      \"id\": \"6358\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Teams

    \n \n \n

    Gets information for a specific Twitch Team.

    \n

    Authentication

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URL

    \n

    GET https://api.twitch.tv/helix/teams

    \n

    Required Query Parameters

    \n\n

    One of the two optional query parameters must be specified to return Team information.

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    namestringTeam name.
    idstringTeam ID.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    usersArray of user objectsUsers in the specified Team.
    users.user_idstringUser ID of a Team member.
    users.user_loginstringLogin of a Team member.
    users.user_namestringDisplay name of a Team member.
    background_image_urlstringURL of the Team background image.
    bannerstringURL for the Team banner.
    created_atstringDate and time the Team was created.
    updated_atstringDate and time the Team was last updated.
    infostringTeam description.
    thumbnail_urlstringImage URL for the Team logo.
    team_namestringTeam name.
    team_display_namestringTeam display name.
    idstringTeam ID.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Team information returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example gets Team information for the Live Coders Team.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/teams?id=6358' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"users\": [\n        {\n          \"user_id\": \"278217731\",\n          \"user_name\": \"mastermndio\",\n          \"user_login\": \"mastermndio\"\n        },\n        {\n          \"user_id\": \"41284990\",\n          \"user_name\": \"jenninexus\",\n          \"user_login\": \"jenninexus\"\n        },\n        ...\n      ],\n      \"background_image_url\": null,\n      \"banner\": null,\n      \"created_at\": \"2019-02-11T12:09:22Z\",\n      \"updated_at\": \"2020-11-18T15:56:41Z\",\n      \"info\": \"<p>An outgoing and enthusiastic group of friendly channels that write code, teach about technology, and promote the technical community.</p>\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/team-livecoders-team_logo_image-bf1d9a87ca81432687de60e24ad9593d-600x600.png\",\n      \"team_name\": \"livecoders\",\n      \"team_display_name\": \"Live Coders\",\n      \"id\": \"6358\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Users

    \n \n \n

    Gets information about one or more specified Twitch users. Users are identified by optional user IDs and/or login name. If neither a user ID nor a login name is specified, the user is looked up by Bearer token.

    \n\n

    The response has a JSON payload with a data field containing an array of user-information elements.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth or App Access Token required.
    • \n
    \n\n

    Authorization

    \n\n
      \n
    • OAuth token with user:read:email scope required to include the user’s verified email address in response.
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/users

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringUser ID. Multiple user IDs can be specified. Limit: 100.
    loginstringUser login name. Multiple login names can be specified. Limit: 100.
    \n\n

    Note: The limit of 100 IDs and login names is the total limit. You can request, for example, 50 of each or 100 of one of them. You cannot request 100 of both.

    \n\n

    A request can include a mixture of login names and user ID. If specifying multiple values (any combination of id and/or login values), separate them with ampersands; e.g.,
    GET https://api.twitch.tv/helix/users?login=<login name>&id=<user ID>...
    GET https://api.twitch.tv/helix/users?id=<user ID>&id=<user ID>...
    GET https://api.twitch.tv/helix/users?login=<login name>&login=<login name>...

    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    broadcaster_typestringUser’s broadcaster type: \"partner\", \"affiliate\", or \"\".
    descriptionstringUser’s channel description.
    display_namestringUser’s display name.
    idstringUser’s ID.
    loginstringUser’s login name.
    offline_image_urlstringURL of the user’s offline image.
    profile_image_urlstringURL of the user’s profile image.
    typestringUser’s type: \"staff\", \"admin\", \"global_mod\", or \"\".
    view_countintegerTotal number of views of the user’s channel.
    emailstringUser’s verified email address. Returned if the request includes the user:read:email scope.
    created_atstringDate when the user was created.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets information about user 141981764.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/users?id=141981764' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"141981764\",\n      \"login\": \"twitchdev\",\n      \"display_name\": \"TwitchDev\",\n      \"type\": \"\",\n      \"broadcaster_type\": \"partner\",\n      \"description\": \"Supporting third-party developers building Twitch integrations from chatbots to game integrations.\",\n      \"profile_image_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/8a6381c7-d0c0-4576-b179-38bd5ce1d6af-profile_image-300x300.png\",\n      \"offline_image_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/3f13ab61-ec78-4fe6-8481-8682cb3b0ac2-channel_offline_image-1920x1080.png\",\n      \"view_count\": 5980557,\n      \"email\": \"not-real@email.com\",\n      \"created_at\": \"2016-12-14T20:32:28.894263Z\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Update User

    \n \n \n

    Updates the description of a user specified by the bearer token. Note that the description parameter is optional should other updatable parameters become available in the future. If the description parameter is not provided, no update will occur and the current user data is returned.

    \n\n

    Authentication

    \n\n
      \n
    • \n

      OAuth token required

      \n
    • \n
    • \n

      Required scope: user:edit

      \n
    • \n
    \n\n

    URL

    \n\n

    PUT https://api.twitch.tv/helix/users?description=<description>

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    descriptionstringUser’s account description
    \n\n

    Response Fields

    \n\n

    Response fields are the same as for Get Users. Email is only returned if the user:read:email is also provided.

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This updates the description of the user specified by Bearer token cfabdegwdoklmawdzdo98xt2fo512y.

    \n\n
    curl  -X PUT 'https://api.twitch.tv/helix/users?description=BaldAngel' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\":[{\n    \"id\": \"44322889\",\n    \"login\": \"dallas\",\n    \"display_name\": \"dallas\",\n    \"type\": \"staff\",\n    \"broadcaster_type\": \"affiliate\",\n    \"description\": \"BaldAngel\",\n    \"profile_image_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/4d1f36cbf1f0072d-profile_image-300x300.png\",\n    \"offline_image_url\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-channel_offline_image-2e82c1df2a464df7-1920x1080.jpeg\",\n    \"view_count\": 6995,\n    \"email\": \"not-real@email.com\",\n    \"created_at\": \"2013-06-03T19:12:02.580593Z\"\n  }]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Users Follows

    \n \n \n

    Gets information on follow relationships between two Twitch users. This can return information like “who is qotrok following,” “who is following qotrok,” or “is user X following user Y.” Information returned is sorted in order, most recent follow first.

    \n\n

    The response has a JSON payload with a data field containing an array of follow relationship elements and a pagination field containing information required to query for more follow information.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    URLs

    \n\n

    GET https://api.twitch.tv/helix/users/follows?from_id=<user ID>
    GET https://api.twitch.tv/helix/users/follows?to_id=<user ID>

    \n\n

    At minimum, from_id or to_id must be provided for a query to be valid.

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Paramaters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    from_idstringUser ID. The request returns information about users who are being followed by the from_id user.
    to_idstringUser ID. The request returns information about users who are following the to_id user.
    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    followed_atstringDate and time when the from_id user followed the to_id user.
    from_idstringID of the user following the to_id user.
    from_loginstringLogin of the user following the to_id user.
    from_namestringDisplay name corresponding to from_id.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    to_idstringID of the user being followed by the from_id user.
    to_loginstringLogin of the user being followed by the from_id user.
    to_namestringDisplay name corresponding to to_id.
    totalintTotal number of items returned.
      \n
    • If only from_id was in the request, this is the total number of followed users.
    • \n
    • If only to_id was in the request, this is the total number of followers.
    • \n
    • If both from_id and to_id were in the request, this is 1 (if the \"from\" user follows the \"to\" user) or 0.
    • \n
    \n
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets the first 20 IDs of users who are following user 23161357.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/users/follows?to_id=23161357' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n   \"total\": 12345,\n   \"data\":\n   [\n      {\n         \"from_id\": \"171003792\",\n         \"from_login\": \"iiisutha067iii\",\n         \"from_name\": \"IIIsutha067III\",\n         \"to_id\": \"23161357\",\n         \"to_name\": \"LIRIK\",\n         \"followed_at\": \"2017-08-22T22:55:24Z\"\n      },\n      {\n         \"from_id\": \"113627897\",\n         \"from_login\": \"birdman616\",\n         \"from_name\": \"Birdman616\",\n         \"to_id\": \"23161357\",\n         \"to_name\": \"LIRIK\",\n         \"followed_at\": \"2017-08-22T22:55:04Z\"\n      },\n      ...\n   ],\n   \"pagination\":{\n     \"cursor\": \"eyJiIjpudWxsLCJhIjoiMTUwMzQ0MTc3NjQyNDQyMjAwMCJ9\"\n   }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Create User Follows

    \n \n \n

    Adds a specified user to the followers of a specified channel.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth Token required
    • \n
    • Required scope: user:edit:follows\n
    • \n
    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/users/follows 

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    from_idstringUser ID of the follower
    to_idstringID of the channel to be followed by the user
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    allow_notificationsBooleanIf true, the user gets email or push notifications (depending on the user’s notification settings) when the channel goes live. Default value is false.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    204Successfully created follows
    400Missing Query Parameter
    422Entity cannot be processed
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example creates a user follow.

    \n\n
    curl -X POST 'https://api.twitch.tv/helix/users/follows' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n-H 'Content-Type: application/json' \\\n--data-raw '{\"to_id\": \"41245072\",\"from_id\": \"57059344\"}'\n
    \n\n

    Example Response

    \n\n
    204 No content\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Delete User Follows

    \n \n \n

    Deletes a specified user from the followers of a specified channel.

    \n\n

    Authentication

    \n\n
      \n
    • \n

      OAuth Token required

      \n
    • \n
    • \n

      Required scope: user:edit:follows

      \n
    • \n
    \n\n

    URL

    \n\n

    DELETE https://api.twitch.tv/helix/users/follows

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    from_idstringUser ID of the follower
    to_idstringChannel to be unfollowed by the user
    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    204User successfully deleted from list of channel followers
    400Missing Query Parameter
    422Entity cannot be processed
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This request deletes a user from the followers of a channel.

    \n\n
    curl -X DELETE 'https://api.twitch.tv/helix/users/follows?from_id=57059344&to_id=41245072' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz'\n
    \n\n

    Example Response

    \n\n
    204 No content\n
    \n\n

     

    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get User Block List

    \n \n \n

    Gets a specified user’s block list. The list is sorted by when the block occurred in descending order (i.e. most recent block first).

    \n

    Authentication

    \n\n
      \n
    • OAuth user token required
    • \n
    • Required scope: user:read:blocked_users\n
    • \n
    \n\n

    URL

    \n

    GET https://api.twitch.tv/helix/users/blocks

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    broadcaster_idstringUser ID for a Twitch user.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    firstintegerMaximum number of objects to return. Maximum: 100. Default: 20.
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    user_idstringUser ID of the blocked user.
    user_loginstringLogin of the blocked user.
    display_namestringDisplay name of the blocked user.
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200User’s block list returned successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example gets a list of users blocked by the specified user.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/users/blocks?broadcaster_id=141981764' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"user_id\": \"135093069\",\n      \"user_login\": \"bluelava\",\n      \"display_name\": \"BlueLava\"\n    },\n    {\n      \"user_id\": \"27419011\",\n      \"user_login\": \"travistyoj\",\n      \"display_name\": \"TravistyOJ\"\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Block User

    \n \n \n

    Blocks the specified user on behalf of the authenticated user.

    \n

    Authentication

    \n\n
      \n
    • OAuth user token required
    • \n
    • Required scope: user:manage:blocked_users\n
    • \n
    \n\n

    URL

    \n

    PUT https://api.twitch.tv/helix/users/blocks

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    target_user_idstringUser ID of the user to be blocked.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    source_contextstringSource context for blocking the user. Valid values: \"chat\", \"whisper\".
    reasonstringReason for blocking the user. Valid values: \"spam\", \"harassment\", or \"other\".
    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    204User blocked successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example blocks a user with an ID of 198704263 on behalf of the authenticated user.

    \n\n
    curl -X PUT 'https://api.twitch.tv/helix/users/blocks?target_user_id=198704263' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n
    \n\n

    Example Response

    \n\n
    204 No Content\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Unblock User

    \n \n \n

    Unblocks the specified user on behalf of the authenticated user.

    \n

    Authentication

    \n\n
      \n
    • OAuth user token required
    • \n
    • Required scope: user:manage:blocked_users\n
    • \n
    \n\n

    URL

    \n

    DELETE https://api.twitch.tv/helix/users/blocks

    \n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    target_user_idstringUser ID of the user to be unblocked.
    \n\n

    Optional Query Parameters

    \n

    None.

    \n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    204User unblocked successfully.
    400Request was invalid.
    401Authorization failed.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example unblocks a user with an ID of 198704263 on behalf of the authenticated user.

    \n\n
    curl -X DELETE 'https://api.twitch.tv/helix/users/blocks?target_user_id=198704263' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: wbmytr93xzw8zbg0p1izqyzzc5mbiz' \\\n
    \n\n

    Example Response

    \n\n
    204 No Content\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get User Extensions

    \n \n \n

    Gets a list of all extensions (both active and inactive) for a specified user, identified by a Bearer token.

    \n\n

    The response has a JSON payload with a data field containing an array of user-information elements.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: user:read:broadcast\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/users/extensions/list

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    can_activatebooleanIndicates whether the extension is configured such that it can be activated.
    idstringID of the extension.
    namestringName of the extension.
    typestring arrayTypes for which the extension can be activated. Valid values: \"component\", \"mobile\", \"panel\", \"overlay\".
    versionstringVersion of the extension.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets installed extensions for the user identified by Bearer token cfabdegwdoklmawdzdo98xt2fo512y.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/users/extensions/list' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"wi08ebtatdc7oj83wtl9uxwz807l8b\",\n      \"version\": \"1.1.8\",\n      \"name\": \"Streamlabs Leaderboard\",\n      \"can_activate\": true,\n      \"type\": [\n        \"panel\"\n      ]\n    },\n    {\n      \"id\": \"d4uvtfdr04uq6raoenvj7m86gdk16v\",\n      \"version\": \"2.0.2\",\n      \"name\": \"Prime Subscription and Loot Reminder\",\n      \"can_activate\": true,\n      \"type\": [\n        \"overlay\"\n      ]\n    },\n    {\n      \"id\": \"rh6jq1q334hqc2rr1qlzqbvwlfl3x0\",\n       \"version\": \"1.1.0\",\n      \"name\": \"TopClip\",\n      \"can_activate\": true,\n      \"type\": [\n        \"mobile\",\n        \"panel\"\n      ]\n    },\n    {\n      \"id\": \"zfh2irvx2jb4s60f02jq0ajm8vwgka\",\n      \"version\": \"1.0.19\",\n      \"name\": \"Streamlabs\",\n      \"can_activate\": true,\n      \"type\": [\n        \"mobile\",\n        \"overlay\"\n      ]\n    },\n    {\n      \"id\": \"lqnf3zxk0rv0g7gq92mtmnirjz2cjj\",\n      \"version\": \"0.0.1\",\n      \"name\": \"Dev Experience Test\",\n      \"can_activate\": true,\n      \"type\": [\n        \"component\",\n        \"mobile\",\n        \"panel\",\n        \"overlay\"\n      ]\n    }\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get User Active Extensions

    \n \n \n

    Gets information about active extensions installed by a specified user, identified by a user ID or Bearer token.

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Optional scope: user:read:broadcast or user:edit:broadcast\n
    • \n
    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/users/extensions

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameter

    \n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    user_idstring

    ID of the user whose installed extensions will be returned. Limit: 1.

    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    activebooleanActivation state of the extension, for each extension type (component, overlay, mobile, panel). If false, no other data is provided.
    componentmapContains data for video-component Extensions.
    idstringID of the extension.
    namestringName of the extension.
    overlaymapContains data for video-overlay Extensions.
    panelmapContains data for panel Extensions.
    versionstringVersion of the extension.
    xint(Video-component Extensions only) X-coordinate of the placement of the extension.
    yint(Video-component Extensions only) Y-coordinate of the placement of the extension.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This updates the description of the user specified by Bearer token cfabdegwdoklmawdzdo98xt2fo512y.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/users/extensions' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": {\n    \"panel\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"rh6jq1q334hqc2rr1qlzqbvwlfl3x0\",\n        \"version\": \"1.1.0\",\n        \"name\": \"TopClip\"\n      },\n      \"2\": {\n        \"active\": true,\n        \"id\": \"wi08ebtatdc7oj83wtl9uxwz807l8b\",\n        \"version\": \"1.1.8\",\n        \"name\": \"Streamlabs Leaderboard\"\n      },\n      \"3\": {\n        \"active\": true,\n        \"id\": \"naty2zwfp7vecaivuve8ef1hohh6bo\",\n        \"version\": \"1.0.9\",\n        \"name\": \"Streamlabs Stream Schedule & Countdown\"\n      }\n    },\n    \"overlay\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"zfh2irvx2jb4s60f02jq0ajm8vwgka\",\n        \"version\": \"1.0.19\",\n        \"name\": \"Streamlabs\"\n      }\n    },\n    \"component\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"lqnf3zxk0rv0g7gq92mtmnirjz2cjj\",\n        \"version\": \"0.0.1\",\n        \"name\": \"Dev Experience Test\",\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"2\": {\n        \"active\": false\n      }\n    }\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Update User Extensions

    \n \n \n

    Updates the activation state, extension ID, and/or version number of installed extensions for a specified user, identified by a Bearer token. If you try to activate a given extension under multiple extension types, the last write wins (and there is no guarantee of write order).

    \n\n

    Authentication

    \n\n
      \n
    • OAuth token required
    • \n
    • Required scope: user:edit:broadcast\n
    • \n
    \n\n

    URL

    \n\n

    PUT https://api.twitch.tv/helix/users/extensions

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n

    None

    \n\n

    Response Fields

    \n\n

    Response fields are the same as for Get User Active Extensions.

    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This updates the installed extensions of the user specified by Bearer token cfabdegwdoklmawdzdo98xt2fo512y.

    \n\n
    curl -X PUT 'https://api.twitch.tv/helix/users/extensions' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-H \"Content-Type: application/json\" \\\n-d '{\n  \"data\": {\n    \"panel\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"rh6jq1q334hqc2rr1qlzqbvwlfl3x0\",\n        \"version\": \"1.1.0\"\n      },\n      \"2\": {\n        \"active\": true,\n        \"id\": \"wi08ebtatdc7oj83wtl9uxwz807l8b\",\n        \"version\": \"1.1.8\"\n      },\n      \"3\": {\n        \"active\": true,\n        \"id\": \"naty2zwfp7vecaivuve8ef1hohh6bo\",\n        \"version\": \"1.0.9\"\n      }\n    },\n    \"overlay\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"zfh2irvx2jb4s60f02jq0ajm8vwgka\",\n        \"version\": \"1.0.19\"\n      }\n    },\n    \"component\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"lqnf3zxk0rv0g7gq92mtmnirjz2cjj\",\n        \"version\": \"0.0.1\",\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"2\": {\n        \"active\": false\n      }\n    }\n  }\n}'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": {\n    \"panel\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"rh6jq1q334hqc2rr1qlzqbvwlfl3x0\",\n        \"version\": \"1.1.0\",\n        \"name\": \"TopClip\"\n      },\n      \"2\": {\n        \"active\": true,\n        \"id\": \"wi08ebtatdc7oj83wtl9uxwz807l8b\",\n        \"version\": \"1.1.8\",\n        \"name\": \"Streamlabs Leaderboard\"\n      },\n      \"3\": {\n        \"active\": true,\n        \"id\": \"naty2zwfp7vecaivuve8ef1hohh6bo\",\n        \"version\": \"1.0.9\",\n        \"name\": \"Streamlabs Stream Schedule & Countdown\"\n      }\n    },\n    \"overlay\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"zfh2irvx2jb4s60f02jq0ajm8vwgka\",\n        \"version\": \"1.0.19\",\n        \"name\": \"Streamlabs\"\n      }\n    },\n    \"component\": {\n      \"1\": {\n        \"active\": true,\n        \"id\": \"lqnf3zxk0rv0g7gq92mtmnirjz2cjj\",\n        \"version\": \"0.0.1\",\n        \"name\": \"Dev Experience Test\",\n        \"x\": 0,\n        \"y\": 0\n      },\n      \"2\": {\n        \"active\": false\n      }\n    }\n  }\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Videos

    \n \n \n

    Gets video information by one or more video IDs, user ID, or game ID. For lookup by user or game, several filters are available that can be specified as query parameters.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth Token or App Access Token
    • \n
    \n\n

    Pagination Support

    \n\n

    Forward pagination for requests that specify user_id or game_id. If a game is specified, a maximum of 500 results are available.

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/videos

    \n\n

    Required Query Parameters

    \n\n

    Each request must specify one or more video ids, one user_id, or one game_id.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringID of the video being queried. Limit: 100. If this is specified, you cannot use any of the optional query parameters below.
    user_idstringID of the user who owns the video. Limit 1.
    game_idstringID of the game the video is of. Limit 1.
    \n\n

    Optional Query Parameters

    \n\n

    These can be used if the request specifies a user_id or game_id, not a video id.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    beforestringCursor for backward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firststringNumber of values to be returned when getting videos by user or game ID. Limit: 100. Default: 20.
    languagestringLanguage of the video being queried. Limit: 1. A language value must be either the ISO 639-1 two-letter code for a supported stream language or “other”.
    periodstringPeriod during which the video was created. Valid values: \"all\", \"day\", \"week\", \"month\". Default: \"all\".
    sortstringSort order of the videos. Valid values: \"time\", \"trending\", \"views\". Default: \"time\".
    typestringType of video. Valid values: \"all\", \"upload\", \"archive\", \"highlight\". Default: \"all\".
    \n\n

    Response Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldsTypeDescription
    idstringID of the video.
    stream_idstringID of the stream that the video originated from if the type is \"archive\". Otherwise set to null.
    user_idstringID of the user who owns the video.
    user_loginstringLogin of the user who owns the video.
    user_namestringDisplay name corresponding to user_id.
    titlestringTitle of the video.
    descriptionstringDescription of the video.
    created_atstringDate when the video was created.
    published_atstringDate when the video was published.
    urlobjectURL of the video.
    thumbnail_urlobjectTemplate URL for the thumbnail of the video.
    viewablestringIndicates whether the video is publicly viewable. Valid values: \"public\", \"private\".
    view_countintNumber of times the video has been viewed.
    languagestringLanguage of the video. A language value is either the ISO 639-1 two-letter code for a supported stream language or “other”.
    typestringType of video. Valid values: \"upload\", \"archive\", \"highlight\".
    durationstringLength of the video.
    muted_segmentsobject[]Array of muted segments in the video. If there are no muted segments, the value will be null.
    segment.durationintegerDuration of the muted segment.
    segment.offsetintegerOffset in the video at which the muted segment begins.
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets information about the video with ID 335921245.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/videos?id=335921245' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"335921245\",\n      \"stream_id\": null,\n      \"user_id\": \"141981764\",\n      \"user_login\": \"twitchdev\",\n      \"user_name\": \"TwitchDev\",\n      \"title\": \"Twitch Developers 101\",\n      \"description\": \"Welcome to Twitch development! Here is a quick overview of our products and information to help you get started.\",\n      \"created_at\": \"2018-11-14T21:30:18Z\",\n      \"published_at\": \"2018-11-14T22:04:30Z\",\n      \"url\": \"https://www.twitch.tv/videos/335921245\",\n      \"thumbnail_url\": \"https://static-cdn.jtvnw.net/cf_vods/d2nvs31859zcd8/twitchdev/335921245/ce0f3a7f-57a3-4152-bc06-0c6610189fb3/thumb/index-0000000000-%{width}x%{height}.jpg\",\n      \"viewable\": \"public\",\n      \"view_count\": 1863062,\n      \"language\": \"en\",\n      \"type\": \"upload\",\n      \"duration\": \"3m21s\",\n      \"muted_segments\": [\n        {\n          \"duration\": 30,\n          \"offset\": 120\n        }\n      ]\n    }\n  ],\n  \"pagination\": {}\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Delete Videos

    \n \n \n

    Deletes one or more videos. Videos are past broadcasts, Highlights, or uploads.

    \n\n

    Invalid Video IDs will be ignored (i.e. IDs provided that do not have a video associated with it). If the OAuth user token does not have permission to delete even one of the valid Video IDs, no videos will be deleted and the response will return a 401.

    \n\n

    Authentication

    \n\n
      \n
    • User OAuth token
    • \n
    • Required scope: channel:manage:videos\n
    • \n
    \n\n

    URL

    \n\n

    DELETE https://api.twitch.tv/helix/videos

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringID of the video(s) to be deleted. Limit: 5.
    \n\n

    Optional Query Parameters

    \n\n

    None.

    \n\n

    Response Codes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CodeMeaning
    200Video(s) deleted.
    400Request was invalid.
    401Authorization failed; either for the API request itself or if the requester is not authorized to delete the specified videos.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This example deletes two videos with the IDs 1234 and 9876.

    \n\n
    curl -X DELETE 'https://api.twitch.tv/helix/videos?id=1234&id=9876' \\\n-H 'Authorization: Bearer 2gbdx6oar67tqtcmt49t3wpcgycthx' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n  \"data\": [\n    \"1234\",\n    \"9876\"\n  ]\n}\n
    \n\n \n
    \n
    \n \n \n \n
    \n
    \n

    Get Webhook Subscriptions

    \n \n \n

    Gets the Webhook subscriptions of an application identified by a Bearer token, in order of expiration.

    \n\n

    The response has a JSON payload with a data field containing an array of subscription elements and a pagination field containing information required to query for more subscriptions.

    \n\n

    Authentication

    \n\n

    App access token

    \n\n

    URL

    \n\n

    GET https://api.twitch.tv/helix/webhooks/subscriptions

    \n\n

    Required Query Parameters

    \n\n

    None

    \n\n

    Optional Query Parameters

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    afterstringCursor for forward pagination: tells the server where to start fetching the next set of results, in a multi-page response. The cursor value specified here is from the pagination response field of a prior query.
    firststring

    Number of values to be returned per page. Limit: 100. Default: 20.

    \n\n

    Response Fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    FieldTypeDescription
    callbackstringThe callback provided for this subscription.
    expires_atstringDate and time when this subscription expires. Encoded as RFC3339. The timezone is always UTC (“Z”).
    paginationobject containing a stringA cursor value, to be used in a subsequent request to specify the starting point of the next set of results. If this is empty, you are at the last page.
    topicstringThe topic used in the initial subscription.
    totalintA hint at the total number of results returned, on all pages. This is an approximation: as you page through the list, some subscriptions may expire and others may be added.
    \n\n \n
    \n\n \n
    \n \n

    Example Request

    \n\n

    This gets up to 10 webhook subscriptions.

    \n\n
    curl -X GET 'https://api.twitch.tv/helix/webhooks/subscriptions?first=10&after=eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IiJ9fQ' \\\n-H 'Authorization: Bearer cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-Id: uo6dggojyb8d6soh92zknwmi5ej1q2'\n
    \n\n

    Example Response

    \n\n
    {\n   \"total\": 12,\n   \"data\": [\n       {\n           \"topic\": \"https://api.twitch.tv/helix/streams?user_id=123\",\n           \"callback\": \"http://example.com/your_callback\",\n           \"expires_at\": \"2018-07-30T20:00:00Z\"\n       },\n       {\n           \"topic\": \"https://api.twitch.tv/helix/streams?user_id=345\",\n           \"callback\": \"http://example.com/your_callback\",\n           \"expires_at\": \"2018-07-30T20:03:00Z\"\n       }\n   ],\n   \"pagination\": {\n       \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IkFYc2laU0k2TVN3aWFTSTZNWDAifX0\"\n   }\n}\n
    \n\n \n
    \n
    \n \n \n
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","webhooks-guide":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Subscriptions
    \n\t\t\n\t\t\t
    Getting Notifications
    \n\t\t\n\t\n\n\n\t\t

    Webhooks Guide

    \n\n
    \n

    Just getting started with Twitch webhooks? Try using EventSub, Twitch’s transport-neutral events solution that makes subscribing to events easier than ever.

    \n
    \n\n

    Introduction

    \n\n

    Webhooks enable your application to subscribe to events that happen on Twitch. When an event to which you are subscribed occurs, Twitch notifies you. For example, you may want to know when:

    \n\n
      \n
    • A user has a new follower.
    • \n
    • A stream has changed state.
    • \n
    • A whisper is sent (future).
    • \n
    \n\n

    Notifications are sent within seconds of event occurrence. Twitch takes extra steps to ensure your notifications are received, even if your servers are down.

    \n\n

    Webhooks adhere to the W3C WebSub specification, a popular implementation that is successfully deployed throughout the industry. As stated in the spec:

    \n\n

    WebSub provides a common mechanism for communication between publishers of any kind of Web content and their subscribers, based on HTTP web hooks. Subscription requests are relayed through hubs, which validate and verify the request. Hubs then distribute new and updated content to subscribers when it becomes available. WebSub was previously known as PubSubHubbub.

    \n\n

    This guide covers the most pertinent aspects of WebSub; see the spec for details.

    \n\n

    Webhooks are a way for you to receive new data as it comes into Twitch, without having to maintain a connection. When new data comes in, Twitch sends you an HTTP request with the event data. You can take advantage of this push model to load balance or proxy requests, just as you would do with production Web traffic.

    \n\n

    Subscriptions

    \n\n

    When you submit a request to subscribe to an event (with the Subscribe To/Unsubscribe From Events endpoint), your request is asynchronously validated to confirm you are allowed to create the subscription. Depending on the results of this validation, Twitch responds by sending you one of two GET requests:

    \n\n
      \n
    • Subscription verify — If your subscription request passes review, Twitch sends you a request to confirm that you requested the subscription. To confirm, respond to the request with the challenge token provided (hub.challenge) in the query parameters and an HTTP success (2xx) response code. Important Note The challenge token should be echoed back in a simple text/plain response, without any JSON/HTML wrapping.
    • \n
    • Subscription denied — In this case, the request will contain a reason (hub.reason) in the query parameters to explain why the subscription could not be created. For example, you may not be authorized to access the resource you requested or you may have exceeded the maximum number of subscriptions.
    • \n
    \n\n

    For examples, see the Webhooks reference documentation.

    \n\n

    All subscriptions have an expiration time, which cannot exceed 10 days. To renew a subscription, make a new subscription request with the same parameters as the original request.

    \n\n

    Limits: By default, each client ID can have at most 10,000 subscriptions. Also, you can subscribe to the same topic at most 3 times. 

    \n\n

    Getting Notifications

    \n\n

    When an event to which you are subscribed occurs, Twitch sends you a POST request with notification data. If you do not get the notification (if, for example, your service is down), Twitch retries, with exponential backoff. A failed notification does not revoke a subscription.

    \n\n

    Rarely, the same notification may be delivered to you twice. For this reason, a unique ID is included in each notification payload, using the Twitch-Notification-Id header. If you want your application to ignore duplicate notifications, keep track of these notification IDs and check that you do not process the same notification twice.

    \n\n

    On receiving a notification, your application should respond immediately with an HTTP success (2xx) response code, to acknowledge successful receipt of the notification. If your application takes longer than 5 seconds to respond, the request is considered to have failed. All other response codes are considered failures and will cause a number of retries. The response code should not be affected by whether your application successfully processed the notification.

    \n\n

    Disambiguating Payloads

    \n\n

    To easily disambiguate notification payloads from each other (especially for stream down events), we recommend you to use a different callback URL for each subscription, for example, changing the path or the query parameters. This is also a way you can provide your own application-specific information to your callbacks.

    \n\n

    Verifying Payloads

    \n\n

    If a secret was provided when you created the subscription, Twitch signs the notification payload using that secret. We strongly recommend that you verify the signature to confirm that the notification is genuine.

    \n\n

    To verify payloads, you need to compute the hash properly. A common reason this may fail is unexpected string manipulation (e.g., JSON encoding or character escaping), which is done automatically by some web frameworks. To debug this, verify that the value of the content-length header matches the number of bytes you received in the notification payload. You may discover that notification hashing for payloads is failing due to unusual Unicode.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","webhooks-reference":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Subscribe To/Unsubscribe From Events
    \n\t\t\n\t\t\t
    Topic: User Follows
    \n\t\t\n\t\t\t
    Topic: Stream Changed
    \n\t\t\n\t\t\t
    Topic: User Changed
    \n\t\t\n\t\t\t
    Topic: Extension Transaction Created
    \n\t\t\n\t\t\t
    Topic: Moderator Change Events
    \n\t\t\n\t\t\t
    Topic: Channel Ban Change Events
    \n\t\t\n\t\t\t
    Topic: Subscription Events
    \n\t\t\n\t\t\t
    Topic: Hype Train Event
    \n\t\t\n\t\n\n\n\t\t

    Webhooks Reference

    \n\n
    \n

    Just getting started with Twitch webhooks? Try using EventSub, Twitch’s transport-neutral events solution that makes subscribing to events easier than ever.

    \n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    EndpointDescription
    Subscribe To/Unsubscribe From EventsSubscribe to or unsubscribe from events for a specified topic.
    \n\n

    Subscribe To/Unsubscribe From Events

    \n\n

    Subscribe to or unsubscribe from events for a specified topic.

    \n\n

    When you subscribe to a webhook, if the parameters are supplied you receive an immediate 202 Accepted response, with an empty body. After this, we will make a call to your callback to verify your subscription; see the Webhooks Guide for information on how to implement your callback.

    \n\n

    Also see the Get Webhooks Subscriptions endpoint.

    \n\n

    Note: Subscription requests affect rate limits in the Twitch API.

    \n\n

    Authentication

    \n\n

    All topics require an authorization token. Authorization requirements are based on the hub.topic supplied, see the reference for each topic.

    \n\n

    URL

    \n\n

    POST https://api.twitch.tv/helix/webhooks/hub

    \n\n

    JSON Body Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescriptionRequired?
    hub.callbackstringURL where notifications will be delivered.Yes
    hub.modestringType of request. Valid values: subscribe, unsubscribe.Yes
    hub.topicstringURL for the topic to subscribe to or unsubscribe from. topic maps to a new Twitch API endpoint.Yes
    hub.lease_secondsintegerNumber of seconds until the subscription expires. Default: 0. Maximum: 864000.

    Should be specified to a value greater than 0 otherwise subscriptions will expire before any useful notifications can be sent.
    Yes
    hub.secretstringSecret used to sign notification payloads. The X-Hub-Signature header is generated by sha256(secret, notification_bytes). We strongly encourage you to use this, so your application can verify that notifications are genuine.\nNo
    \n\n

    Topic: User Follows

    \n\n

    Notifies when a follows event occurs. The response mimics the Get Users Follows endpoint.

    \n\n

    hub.topic URL

    \n\n

    https://api.twitch.tv/helix/users/follows

    \n\n

    Required Query Parameters

    \n\n

    The first parameter must be specified, along with from_id and/or to_id.  

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    firstintegerMust be 1.
    from_idintegerSpecifies the user who starts following someone.
    to_idintegerSpecifies the user who has a new follower.
    \n\n

    Example hub.topic URLs

    \n\n
      \n
    • User 1336 follows someone: https://api.twitch.tv/helix/users/follows?first=1&from_id=1336\n
    • \n
    • User 1337 has a new follower: https://api.twitch.tv/helix/users/follows?first=1&to_id=1337\n
    • \n
    • User 1336 follows user 1337: https://api.twitch.tv/helix/users/follows?first=1&from_id=1336&to_id=1337\n
    • \n
    \n\n

    Example Notification Payload

    \n\n
    {\n  \"data\": [\n    {\n      \"from_id\": \"1336\",\n      \"from_name\": \"ebi\",\n      \"to_id\": \"1337\",\n      \"to_name\": \"oliver0823nagy\",\n      \"followed_at\": \"2017-08-22T22:55:24Z\"\n    }\n  ]\n}\n
    \n\n

    Topic: Stream Changed

    \n\n

    Notifies when a stream changes; e.g., stream goes online or offline, the stream title changes, or the game changes. The response mimics the Get Streams endpoint.

    \n\n

    hub.topic URL

    \n\n

    https://api.twitch.tv/helix/streams

    \n\n

    Required Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idintegerSpecifies the user whose stream is monitored.
    \n\n

    Example hub.topic URL

    \n\n

    User 5678’s stream changes: https://api.twitch.tv/helix/streams?user_id=5678

    \n\n

    Example Notification Payload for Stream Offline Event

    \n\n
    {\n  \"data\": []\n}\n
    \n\n

    Example Notification Payload for Other Stream Change Events

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"0123456789\",\n      \"user_id\": \"5678\",\n      \"user_name\": \"wjdtkdqhs\",\n      \"game_id\": \"21779\",\n      \"community_ids\": [],\n      \"type\": \"live\",\n      \"title\": \"Best Stream Ever\",\n      \"viewer_count\": 417,\n      \"started_at\": \"2017-12-01T10:09:45Z\",\n      \"language\": \"en\",\n      \"thumbnail_url\": \"https://link/to/thumbnail.jpg\"\n    }\n  ]\n}\n
    \n\n

    Topic: User Changed

    \n\n

    Notifies when a user changes information about his/her profile. The response mimics the Get Users endpoint. This web hook requires the user:read:email OAuth scope to get notifications of email changes.

    \n\n

    hub.topic URL

    \n\n

    https://api.twitch.tv/helix/users

    \n\n

    Authentication

    \n\n

    Token must have the user:read:email scope for the user in question

    \n\n

    Required Query Parameter

    \n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    idintegerSpecifies the user whose data is monitored.
    \n\n

    Example hub.topic URL

    \n\n

    User 1234’s profile data changes: https://api.twitch.tv/helix/users?id=1234

    \n\n

    Example Notification Payload

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1234\",\n      \"login\": \"1234login\",\n      \"display_name\": \"hiiam1234\",\n      \"type\": \"staff\",\n      \"broadcaster_type\": \"\",\n      \"description\": \"1234 is me\",\n      \"profile_image_url\": \"https://link/to/pic/1234.jpg\",\n      \"offline_image_url\": \"https://link/to/offline_pic/1234_off.jpg\",\n      \"view_count\": 3455\n    }\n  ]\n}\n
    \n\n

    Topic: Extension Transaction Created

    \n\n

    Sends a notification when a new transaction is created for an extension. The response mimics the Get Extension Transactions endpoint.

    \n\n

    Hub Topic URL

    \n\n

    https://api.twitch.tv/helix/extensions/transactions

    \n\n

    Authentication

    \n\n

    App Access Token

    \n\n

    Authorization

    \n\n

    OAuth Token Client ID must match Extension Client ID.

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    extension_idstringID of the extension to listen to for transactions. Maximum: 1
    firstintegerMust be 1.
    \n\n

    Example hub.topic URL

    \n\n

    Extension d1dp7kdgsq3yg4ddyyel9mz5jebvoo creates a new transaction:

    \n\n

    https://api.twitch.tv/helix/extensions/transactions?extension_id=d1dp7kdgsq3yg4ddyyel9mz5jebvoo&first=1

    \n\n

    Example Notification Payload

    \n\n

    The notification payload from a web hook will always be the same as the payload from the API endpoint on which the web hook relies.

    \n\n
    {\n  \"data\": [\n    {\n      \"broadcaster_id\": \"23829576\",\n      \"broadcaster_name\": \"skeltonath\",\n      \"id\": \"2dfe47d0-80e1-4bc6-90e6-0536f4dfedcd\",\n      \"product_data\": {\n        \"cost\": {\n          \"amount\": 100,\n          \"type\": \"bits\"\n        },\n        \"broadcast\": false,\n        \"displayName\": \"Test Item\",\n        \"domain\": \"twitch.ext.d1dp7kdgsq3yg4ddyyel9mz5jebvoo\",\n        \"expiration\": \"\",\n        \"inDevelopment\": true,\n        \"sku\": \"testItem\"\n      },\n      \"product_type\": \"BITS_IN_EXTENSION\",\n      \"timestamp\": \"2019-04-04T21:37:19Z\",\n      \"user_id\": \"132996918\",\n      \"user_name\": \"skeltest\"\n    }\n  ]\n}\n
    \n\n

    Topic: Moderator Change Events

    \n\n

    Notifies when a broadcaster adds or removes moderators.

    \n\n

    Hub Topic URL

    \n\n

    https://api.twitch.tv/helix/moderation/moderators/events

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringUser ID of the broadcaster. Must match the User ID in the Bearer token.
    firstintegerMust be 1.
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idintegerSpecifies the user ID of the moderator added or removed.
    \n\n

    Example hub.topic URLs

    \n\n
      \n
    • Broadcaster aan22209 adds or removes any moderators: https://api.twitch.tv/helix/moderation/moderators/events?broadcaster_id=198704263&first=1\n
    • \n
    • Broadcaster aan22209 adds or removes user glowillig as a moderator: https://api.twitch.tv/helix/moderation/moderators/events?broadcaster_id=1&first=1&user_id=2\n
    • \n
    \n\n

    Example Notification Payload

    \n\n

    Notification payload from a webhook will always be the same as the payload from the API endpoint on which the webhook relies.

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1IVKZGWSqf45QIgf6WFKtYpd0Or\",\n      \"event_type\": \"moderation.moderator.add\",\n      \"event_timestamp\": \"2019-03-15T19:32:58Z\",\n      \"version\": \"v1\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_name\": \"aan22209\",\n        \"user_id\": \"423374343\",\n        \"user_name\": \"glowillig\"\n      }\n    }\n  ]\n}\n
    \n\n

    Topic: Channel Ban Change Events

    \n\n

    Notifies when a broadcaster bans or un-bans people in their channel.

    \n\n

    Hub Topic URL

    \n\n

    https://api.twitch.tv/helix/moderation/banned/events

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringUser ID of the broadcaster. Must match the User ID in the Bearer token.
    firstintegerMust be 1.
    \n\n

    Optional Query Parameter

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idintegerSpecifies the user ID of the moderator added or removed.
    \n\n

    Use Cases

    \n\n
      \n
    • Broadcaster aan22209 bans anyone in their channel: https://api.twitch.tv/helix/moderation/banned/events?broadcaster_id=198704263&first=1\n
    • \n
    • Broadcaster aan22209 bans or unbans user glowillig in their channel: https://api.twitch.tv/helix/moderation/banned/events?broadcaster_id=198704263&first=1&user_id=423374343\n
    • \n
    \n\n

    Example Notification Payload

    \n\n

    Notification payload from a webhook will always be the same as the payload from the API endpoint on which the webhook relies.

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1IVKZGWSqf45QIgf6WFKtYpd0Or\",\n      \"event_type\": \"moderation.user.ban\",\n      \"event_timestamp\": \"2019-03-15T19:32:58Z\",\n      \"version\": \"v1\",\n      \"event_data\": {\n        \"broadcaster_id\": \"198704263\",\n        \"broadcaster_name\": \"aan22209\",\n        \"user_id\": \"423374343\",\n        \"user_name\": \"glowillig\"\n      }\n    }\n  ]\n}\n
    \n\n

    Topic: Subscription Events

    \n\n

    This webhook notifies you when:

    \n\n
      \n
    • A payment has been processed for a subscription or unsubscription.
    • \n
    • A user who is subscribed to a broadcaster notifies the broadcaster of their subscription in the chat. 
    • \n
    \n\n
    \n

    Warning: The data returned from this topic may be unreliable. If you need notifications for new channel subscriptions, consider using EventSub’s channel.subscribe subscription type for channel subscribe events. Learn more about EventSub.

    \n
    \n\n

    Hub Topic URL

    \n\n

    https://api.twitch.tv/helix/subscriptions/events

    \n\n

    Authentication

    \n\n

    Required OAuth Scope: channel:read:subscriptions

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringUser ID of the broadcaster. Must match the User ID in the Bearer token.
    firststringMust be 1.
    Must be the second parameter in the query string.
    \n\n

    Optional Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringID of the subscribed user. Currently only one user_id at a time can be queried.
    gifter_idstringID of the user who gifted the sub. 
    Returns an empty string for subs that are not gifted (is_gift=false).
    Returns 274598607 for anonymous gifts.
    gifter_namestringDisplay name of the user who gifted the sub. 
    Returns an empty string for subs that are not gifted (is_gift=false). 
    Returns AnAnonymousGfiter for anonymous gifts.
    \n\n

    Example hub.topic URL

    \n\n

    https://api.twitch.tv/helix/subscriptions/events?broadcaster_id=<broadcaster_id>&first=1

    \n\n

    Example Notification Payloads

    \n\n

    At 2020-03-16T16:31:42 hami0315 subscribed to the broadcaster meka:

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"3Wba7BrK0NQuEX9BO8emK8aHfpK\",\n      \"event_type\": \"subscriptions.subscribe\",\n      \"event_timestamp\": \"2020-03-16T16:31:42Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"158038007\",\n        \"broadcaster_name\": \"meka\",\n        \"is_gift\": true,\n        \"plan_name\": \"Channel Subscription (meka)\",\n        \"tier\": \"1000\",\n        \"user_id\": \"505037911\",\n        \"user_name\": \"hami0315\",\n        \"gifter_id\": \"156900877\",\n        \"gifter_name\": \"baxter4343\"\n      }\n    }\n  ]\n}\n
    \n\n

    At 2019-02-03T08:14:19 dallas notified broadcaster Birdman616 of their subscription in chat:

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1Gf161qjQtk0mOMD4VeIMjTGPUk\",\n      \"event_type\": \"subscriptions.notification\",\n      \"event_timestamp\": \"2019-02-03T08:14:19Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"113627897\",\n        \"broadcaster_name\": \"Birdman616\",\n        \"is_gift\": true,\n        \"plan_name\": \"Channel Subscription (Birdman616)\",\n        \"tier\": \"1000\",\n        \"user_id\": \"44322889\",\n        \"user_name\": \"dallas\",\n        \"message\": \"You are the best\"\n      }\n    }\n  ]\n}\n
    \n\n

     Note: plan_name and tier will always be empty fields for unsubscribe. 

    \n\n

    Topic: Hype Train Event

    \n\n

    Notifies when a hype train progression occurs; e.g., a viewer subs, gifts, or uses Bits that kicks off or contributes towards a Hype Train. The response mimics the Get Hype Train Event endpoint.

    \n\n

    hub.topic URL

    \n\n

    https://api.twitch.tv/helix/hypetrain/events

    \n\n

    Authentication

    \n\n

    Required OAuth Scope: channel:read:hype_train

    \n\n

    Required Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_idstringUser ID of the broadcaster. Must match the User ID in the Bearer token.
    \n\n

    Example hub.topic URL

    \n\n

    https://api.twitch.tv/helix/hypetrain/events?broadcaster_id=<broadcaster_id>&first=1

    \n\n

    Example Notification Payload

    \n\n

    At 2020-04-24T20:07:24 user with id 134247454 contributed 200 bits towards the progression of the Hype Train on broadcaster with id 270954519:

    \n\n
    {\n  \"data\": [\n    {\n      \"id\": \"1b0AsbInCHZW2SQFQkCzqN07Ib2\",\n      \"event_type\": \"hypetrain.progression\",\n      \"event_timestamp\": \"2020-04-24T20:07:24Z\",\n      \"version\": \"1.0\",\n      \"event_data\": {\n        \"broadcaster_id\": \"270954519\",\n        \"cooldown_end_time\": \"2020-04-24T20:13:21.003802269Z\",\n        \"expires_at\": \"2020-04-24T20:12:21.003802269Z\",\n        \"goal\": 1800,\n        \"id\": \"70f0c7d8-ff60-4c50-b138-f3a352833b50\",\n        \"last_contribution\": {\n          \"total\": 200,\n          \"type\": \"BITS\",\n          \"user\": \"134247454\"\n        },\n        \"level\": 2,\n        \"started_at\": \"2020-04-24T20:05:47.30473127Z\",\n        \"top_contributions\": [\n          {\n            \"total\": 600,\n            \"type\": \"BITS\",\n            \"user\": \"134247450\"\n          }\n        ],\n        \"total\": 600\n      }\n    }\n  ],\n  \"pagination\": {\n    \"cursor\": \"eyJiIjpudWxsLCJhIjp7IkN1cnNvciI6IjI3MDk1NDUxOToxNTg3NzU4ODQ0OjFiMEFzYkluQ0haVzJTUUZRa0N6cU4wN0liMiJ9fQ\"\n  }\n}\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","authentication":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Validating requests
    \n\t\t\n\t\t\t
    Registration
    \n\t\t\n\t\t\t
    Types of tokens
    \n\t\t\n\t\t\t
    Getting tokens
    \n\t\t\n\t\t\t
    Sending user access and app access tokens
    \n\t\t\n\t\t\t
    Revoking access tokens
    \n\t\t\n\t\t\t
    Refreshing access tokens
    \n\t\t\n\t\t\t
    Scopes
    \n\t\t\n\t\n\n\n\t\t

    Authentication

    \n\n

    Introduction

    \n\n

    This guide describes how to use Twitch Authentication to enable your application to take actions on behalf of a Twitch account or access certain data about users’ accounts. The preferred method of authentication is OAuth. We use parts of the OAuth 2.0 protocol.

    \n\n

    In addition to OAuth, Twitch supports OIDC (OpenID Connect) for a more secure OAuth 2.0 flow. OIDC tokens are compatible with services built for OIDC compliance, such as Cognito by Amazon Web Services.

    \n\n

    Authentication involves:

    \n\n
      \n
    1. \nRegistering your app to obtain a client ID and client secret.
    2. \n
    3. \nGetting a token. This includes specifying scopes, the permissions your app requires.
    4. \n
    5. \nSending the token in your API request, to authenticate API requests.
    6. \n
    \n\n

    Code samples are available for Go and Node.js.

    \n\n

    Warning: Treat your token like a password. For example, never use access tokens in any public URL, and never display tokens on any web page without requiring a click to de-obfuscate.

    \n\n

    Validating requests

    \n\n

    If you use Twitch authentication for login purposes only, access tokens should be validated on a recurring interval. Periodic validation of previously issued OAuth tokens ensures that users who authorized your application have not decided to disconnect the integration.

    \n\n

    You must validate access tokens before making API requests which perform mutations on or access sensitive information of users, if it has been more than one hour since the last validation.

    \n\n

    Twitch periodically conducts audits. If we discover an application that is not re-validating access tokens (that is, an application that validates only for login and not thereafter), we will reach out and work with developers to resolve the issue. If the issue is not resolved, we may take punitive action, such as revoking the developer’s API key or throttling the application’s performance.

    \n\n

    Validation is important because of how OAuth access tokens work and the end user’s expectation of OAuth session control. For example, users who opt to disconnect your integration from their Twitch accounts can do so from their account settings on Twitch. When a user disconnects from an integration, all OAuth tokens between that user and that integration are invalidated. In this scenario, the expectation is that OAuth tokens are tied to sessions on third-party services; as such, any existing sessions between the disconnected user and those services also should be invalidated.

    \n\n

    When validating each of your requests, submit a request to the validation endpoint (https://id.twitch.tv/oauth2/validate) with your OAuth token in the header. If you are authenticated, the response includes the status of your token. A successful response indicates that your access token is valid.

    \n\n

    Here is a sample request:

    \n\n
    curl -H \"Authorization: OAuth <access token>\" https://id.twitch.tv/oauth2/validate\n
    \n\n

    And here is a sample response:

    \n\n
    {\n  \"client_id\": \"wbmytr93xzw8zbg0p1izqyzzc5mbiz\",\n  \"login\": \"twitchdev\",\n  \"scopes\": [\n    \"channel:read:subscriptions\"\n  ],\n  \"user_id\": \"141981764\",\n  \"expires_in\": 5520838\n}\n
    \n\n

    Registration

    \n\n

    To make an application that uses the Twitch API, you first need to register your application on the Twitch developer site. When creating this app, enter your redirect URI, which is where your users are redirected after being authorized. You can provide several redirect URIs, for example, if you wish to use the same client for different environments.

    \n\n

    Once you create a developer application, you are assigned a client ID. Some authentication flows also require a client secret, which you can generate on the same page as the client ID.

    \n\n
      \n
    • Client IDs are public and can be shared (for example, embedded in the source of a Web page).
    • \n
    • Client secrets are equivalent to a password for your application and must be kept confidential. Never expose it to users, even in an obscured form.
    • \n
    \n\n

    Because your client secret is confidential, we cannot show it to you once you leave the page, so make sure to record it somewhere safe. Also, generating a new client secret immediately invalidates the current one, which might make your API requests fail until your app is updated.

    \n\n

    Warning: Client IDs should be unique for each application: do not re-use client IDs across multiple applications. Also, applications should request the appropriate scopes for the intended target APIs. Failure to adhere to these guidelines may result in the suspension of your application’s access to the Twitch API.

    \n\n

    Types of tokens

    \n\n

    Twitch supports several types of tokens:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Token TypeDescription
    ID tokens (OIDC)A set of claims about the end user, for a given authorization. Using OIDC ID tokens (JWT) enables you to get details about your user (such as email address) for a particular authorization. These details are represented by claims in the ID token’s payload.

    Our discovery endpoint is at https://id.twitch.tv/oauth2/.well-known/openid-configuration. It can be used with standard OIDC clients like AWS Cognito.
    User access tokensAuthenticate users and allow your app to make requests on their behalf. If your application uses Twitch for login or makes requests in the context of an authenticated user, you need to generate a user access token.
    App access tokensAuthenticate your app and allow it to access resources that it owns. Since app access tokens are not associated with a user, they cannot be used with endpoints that require user authentication.

    Some Twitch API endpoints require application authentication (not user authentication). If your application uses these endpoints, you need to generate an app access token. App access tokens get client credentials (not user credentials). They enable you to make secure API requests that are not on behalf of a specific user. Client credentials also may be used in place of client ID headers to securely identify your application.

    App access tokens expire after about 60 days, so you should check that your app access token is valid by submitting a request to the validation endpoint (see Validating Requests). If your token has expired, generate a new one.

    App access tokens are meant only for server-to-server API requests and should never be included in client code.\n
    \n\n

    User access tokens and app access tokens are both bearer tokens. “Bearer” comes from the authorization header; see Sending User Access and App Access Tokens.

    \n\n

    Getting tokens

    \n\n

    The domain dedicated to Twitch authentication is https://id.twitch.tv.

    \n\n

    Note: URLs have been updated to replace https://api.twitch.tv/kraken with https://id.twitch.tv. Code that uses the old kraken domain for Twitch authentication will continue to work until the removal of Twitch API v. 5 functionality. Twitch API v. 5 is currently deprecated.

    \n\n

    We support several authentication flows:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Flow TypeDescription
    Implicit code flowYour app does not use a server, such as a client-side JavaScript app or mobile app. This approach does not require a server that must make requests to the API.
    Authorization code flowYour application uses a server, can securely store a client secret, and can make server-to-server requests.
    Client credentials flowYou need an app access token.
    \n\n

    The procedure you should use to get tokens depends on the type(s) of tokens you want:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ProcedureUser Access TokenID TokenApp Access Token
    OIDC Implicit Code Flow 
    OAuth Implicit Code Flow  
    OIDC Authorization Code Flow 
    OAuth Authorization Code Flow  
    OAuth Client Credentials Flow  
    \n\n

    For security purposes, examples in these sections use a fake access token, 0123456789abcdefghijABCDEFGHIJ.

    \n\n

    Sending user access and app access tokens

    \n\n

    When an API request requires authentication, send the access token as a header. The header differs, depending on which API you use:

    \n\n

    In the Twitch API:
    curl -H \"Authorization: Bearer <access token>\" https://api.twitch.tv/helix/

    \n\n

    In Twitch API v5 (deprecated ):
    curl -H \"Authorization: OAuth <access token>\" https://api.twitch.tv/kraken/

    \n\n

    Revoking access tokens

    \n\n

    To clean up previously obtained access tokens, use the Twitch OAuth token-revocation endpoint. The implementation follows the OAuth standard.

    \n\n

    On your server, revoke an access token by making this request:

    \n\n
    POST https://id.twitch.tv/oauth2/revoke\n    ?client_id=<your client ID>\n    &token=<your OAuth token>\n
    \n\n

    For example, using our previously authenticated user, the request is:

    \n\n
    POST https://id.twitch.tv/oauth2/revoke?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&token=0123456789abcdefghijABCDEFGHIJ\n
    \n\n

    This request also works for app access tokens. To revoke the app access token we created previously, make this request:

    \n\n
    POST https://id.twitch.tv/oauth2/revoke?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&token=prau3ol6mg5glgek8m89ec2s9q5i3i\n
    \n\n

    Successful requests return 200 OK with no body. Requests with invalid tokens return 400 Bad Request with an “Invalid token” message in the body of the response.

    \n\n

    Malformed requests return 400 Bad Request, along with information about how to fix the request, typically reminding the requester to include the client_id.

    \n\n

    Refreshing access tokens

    \n\n

    New OAuth2 access tokens have expirations. Token-expiration periods vary in length, based on how the token was acquired. Tokens return an expires_in field indicating how long the token should last. However, you should build your applications in such a way that they are resilient to token authentication failures. In other words, an application capable of refreshing tokens should not need to know how long a token will live. Rather, it should be prepared to deal with the token becoming invalid at any time.

    \n\n

    To allow for applications to remain authenticated for long periods in a world of expiring tokens, we allow for sessions to be refreshed, in accordance with the guidelines in “Refreshing an Access Token” in the OAuth2 RFC. Generally, refresh tokens are used to extend the lifetime of a given authorization.

    \n\n

    Note: App access tokens and ID tokens cannot be refreshed.

    \n\n

    How to refresh

    \n\n

    To refresh a token, you need an access token/refresh token pair coming from a body. For example:

    \n\n
    {\n  \"access_token\": \"0123456789abcdefghijABCDEFGHIJ\",\n  \"refresh_token\": \"eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\",\n  \"expires_in\": 3600,\n  \"scope\": \"viewing_activity_read\",\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    You also need the client_id and client_secret used to generate the above access token/refresh token pair

    \n\n

    To refresh, use this request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    --data-urlencode\n    ?grant_type=refresh_token\n    &refresh_token=<your refresh token>\n    &client_id=<your client ID>\n    &client_secret=<your client secret>\n
    \n\n

    There are several required parameters and one optional parameter:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParametersTypeDescription
    client_idstringYour client ID.
    client_secretstringYour client secret.
    grant_typestringMust be refresh_token.
    refresh_tokenstringRefresh token issued to the client.

    Your refresh token may contain characters that are not URL safe, so be sure to URL encode the characters of your refresh token before inserting it into the body of the refresh request. Otherwise, you may get an error (“Invalid refresh token”) when you try to refresh.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    scopestringSpace-separated list of scopes. This must be the entire set or any subset of the scopes assigned to the original token grant. It cannot include any scope not originally granted by the resource owner. Default: the entire set of scopes originally granted.
    \n\n

    Example:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    --data-urlencode\n    ?grant_type=refresh_token\n    &refresh_token=eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\n    &client_id=fooid\n    &client_secret=barbazsecret\n
    \n\n

    Here is a sample response on success. It contains the new access token, refresh token, and scopes associated with the new grant. Your application should then update its record of the refresh token to be the value provided in this response, as the refresh token may change between requests.

    \n\n
    {\n  \"access_token\": \"asdfasdf\",\n  \"refresh_token\": \"eyJfMzUtNDU0OC04MWYwLTQ5MDY5ODY4NGNlMSJ9%asdfasdf=\",\n  \"scope\": \"viewing_activity_read\"\n}\n
    \n\n

    Here is the body of an unsuccessful response:

    \n\n
    {\n  \"error\": \"Bad Request\",\n  \"status\": 400,\n  \"message\": \"Invalid refresh token\"\n}\n
    \n\n

    When a user changes their password or disconnects an app, we delete all tokens for that user. Both refresh and access tokens for that user will return 401 Unauth.

    \n\n

    Refresh in response to server rejection for bad authentication

    \n\n

    We recommend that you refresh your tokens in response to being rejected by the server for bad authentication. It is good practice to assume that your access token can expire or be revoked at any time, and refreshing reactively ensures that your application is prepared to deal with such situations as gracefully as possible. For this reason, refreshing in response to server rejection is preferable to refreshing proactively, on a fixed schedule.

    \n\n

    When you make a request with expired or incorrect authorization credentials, the API returns a 401 Unauthorized status:

    \n\n
    DELETE /kraken/users/test_user1/follows/channels/test_channel HTTP/1.1\nHost: api.twitch.tv\nUser-Agent: curl/7.43.0\nAccept: application/vnd.twitchtv.v3+json\nAuthorization: OAuth <access_token>\nClient-ID: retgzhvpsxjwun0rvrb1rfwheegu1yw\n\nHTTP/1.1 401 Unauthorized\nAccept-Ranges: bytes\nAccess-Control-Allow-Headers:\nAccess-Control-Allow-Methods:\nAccess-Control-Allow-Origin: *\nAge: 0\nCache-Control: max-age=0, private, must-revalidate\nContent-Type: application/json; charset=utf-8\nDate: Wed, 12 Oct 2016 22:25:10 GMT\nServer: nginx\nStatus: 401 Unauthorized\nVary: Accept-Encoding\nVia: 1.1 varnish\nContent-Length: 89\nConnection: keep-alive\n\n{\n    \"error\": \"Unauthorized\",\n    \"message\": \"Token invalid or missing required scope\",\n    \"status\": 401\n}\n
    \n\n

    On seeing a 401 error, an application should try to refresh the session if a refresh token is present. If the refresh fails, the application should re-prompt the end user with another authentication dialog via the standard OAuth 2 flow.

    \n\n

    Handling token refreshes in an application

    \n\n

    We recommend that you do access-token refreshes synchronously with respect to all consumers of a given access token. That is, do not send multiple, simultaneous refresh requests for the same token. Send one refresh request, then redistribute the new token that is returned from that request to all consumers, as appropriate.

    \n\n

    The API limits the number of active access tokens associated with a given refresh token. The limit is 50 token per client/user (that is, a user can only have 50 tokens live at a time per client ID). If multiple threads sharing the same authorization were to simultaneously refresh, some of them might not have working credentials at the end of the refresh. Synchronizing on the refresh operation prevents the application from inadvertently overrunning its limit.

    \n\n

    Scopes

    \n\n

    As mentioned above, when you request authorization from users, the URL scope parameter allows you to specify which permissions your app requires. These scopes are tied to the access token you receive on successful authorization. Without specifying scopes, your app can access only basic information about the authenticated user.

    \n\n

    Scopes are specified as a space-separated list in the URL scope parameter, when requesting authorization:

    \n\n

    &scope=user:edit%20user:read:email

    \n\n

    Ask for only the permissions you need, as users can view each requested permission when authorizing your app.

    \n\n

    No scopes are needed when requesting app access tokens.

    \n\n

    Twitch API

    \n\n

    Multiple scopes can be specified when requesting an OAuth or OIDC token. To see which endpoints can be used with these scopes, refer to the Twitch API reference.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Scope NameType of Access
    analytics:read:extensionsView analytics data for the Twitch Extensions owned by the authenticated account.
    analytics:read:gamesView analytics data for the games owned by the authenticated account.
    bits:readView Bits information for a channel.
    channel:edit:commercialRun commercials on a channel.
    channel:manage:broadcastManage a channel’s broadcast configuration, including updating channel configuration and managing stream markers and stream tags.
    channel:manage:extensionsManage a channel’s Extension configuration, including activating Extensions.
    channel:manage:redemptionsManage Channel Points custom rewards and their redemptions on a channel.
    channel:manage:videosManage a channel’s videos, including deleting videos.
    channel:read:editorsView a list of users with the editor role for a channel.
    channel:read:hype_trainView Hype Train information for a channel.
    channel:read:redemptionsView Channel Points custom rewards and their redemptions on a channel.
    channel:read:stream_keyView an authorized user’s stream key.
    channel:read:subscriptionsView a list of all subscribers to a channel and check if a user is subscribed to a channel.
    clips:editManage Clips for a channel.
    moderation:readView a channel’s moderation data including Moderators, Bans, Timeouts, and Automod settings.
    user:editManage a user object.
    user:edit:followsEdit a user’s follows.
    user:read:blocked_usersView the block list of a user.
    user:manage:blocked_usersManage the block list of a user.
    user:read:broadcastView a user’s broadcasting configuration, including Extension configurations.
    user:read:emailRead an authorized user’s email address.
    \n\n

    Legacy Twitch API v5

    \n\n

    With the deprecation of Twitch API v5, the scopes below have been mapped to Twitch API scopes for an easier migration between versions. You can find this mapping and information about equivalent endpoints on the Twitch API Migration Guide.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Scope NameType of Access
    channel_subscriptionsRead all subscribers to a channel.
    channel_commercialTrigger commercials on a channel.
    channel_editorWrite channel metadata (game, status, etc).
    user_follows_editManage a user’s followed channels.
    channel_readView a channel’s email address and stream key.
    user_readView a user’s information.
    user_blocks_readRead a user’s block list.
    user_blocks_editManage a user’s block list.
    \n\n

    Chat and PubSub

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Scope NameType of Access
    channel:moderatePerform moderation actions in a channel. The user requesting the scope must be a moderator in the channel.
    chat:editSend live stream chat and rooms messages.
    chat:readView live stream chat and rooms messages.
    whispers:readView your whisper messages.
    whispers:editSend whisper messages.
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","getting-tokens-oauth":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    OAuth implicit code flow
    \n\t\t\n\t\t\t
    OAuth authorization code flow
    \n\t\t\n\t\t\t
    OAuth client credentials flow
    \n\t\t\n\t\n\n\n\t\t

    Getting Tokens: OAuth

    \n\n

    Introduction

    \n\n

    There are three OAuth procedures:

    \n\n\n\n

    See the Apps & Authentication Guide for an explanation of the different types of procedures.

    \n\n

    OAuth implicit code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. An authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system.

    \n\n

    Create a <a href=\"\">login</a>:

    \n\n
    GET https://id.twitch.tv/oauth2/authorize\n    ?client_id=<your client ID>\n    &redirect_uri=<your registered redirect URI>\n    &response_type=<type>\n    &scope=<space-separated list of scopes>\n
    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringSpecifies what information to return. This must be token, to return an access token. The user may be prompted to confirm authorization once or repeatedly; this is controlled by the optional force_verify parameter, below.
    scopestringSpace-separated list of scopes.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    force_verifybooleanSpecifies whether the user should be re-prompted for authorization. If this is true, the user always is prompted to confirm authorization. This is useful to allow your users to switch Twitch accounts, since there is no way to log users out of the API. Default: false (a given user sees the authorization page for a given set of scopes only the first time through the sequence).
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to a user’s viewing activity (by specifying the viewing_activity_read scope) and send the user to http://localhost:

    \n\n
    GET 'https://id.twitch.tv/oauth2/authorize?response_type=token&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read&state=c3ab8aa609ea11e793ae92361f002671'\n
    \n\n

    2) If the user authorizes your application, the user is redirected to your redirect URL:

    \n\n
    https://<your registered redirect URI>#access_token=<an access token>\n
    \n\n

    The access token is in the URL fragment, not the query string, so it will not show up in HTTP requests to your server. URI fragments can be accessed from JavaScript with document.location.hash.

    \n\n

    The response includes the state parameter, if it was in your request.

    \n\n

    In our example, your user gets redirected to:

    \n\n
    https://localhost#access_token=0123456789abcdefghijABCDEFGHIJ\n    &scope=viewing_activity_read\n    &state=c3ab8aa609ea11e793ae92361f002671\n    &token_type=bearer\n
    \n\n

    OAuth authorization code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. Then, an authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system. Use this request:

    \n\n
    GET https://id.twitch.tv/oauth2/authorize\n    ?client_id=<your client ID>\n    &redirect_uri=<your registered redirect URI>\n    &response_type=code\n    &scope=<space-separated list of scopes>\n
    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringThis must be code, causing an authorization code to be returned, which is used later in this procedure. A given user is prompted to confirm authorization only on the first request.
    scopestringSpace-separated list of scopes.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    force_verifybooleanSpecifies whether the user should be re-prompted for authorization. If this is true, the user always is prompted to confirm authorization. This is useful to allow your users to switch Twitch accounts, since there is no way to log users out of the API. Default: false (a given user sees the authorization page for a given set of scopes only the first time through the sequence).
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to a user’s viewing activity (by specifying the viewing_activity_read scope) and send the user to http://localhost:

    \n\n
    GET 'https://id.twitch.tv/oauth2/authorize?response_type=code&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read&state=c3ab8aa609ea11e793ae92361f002671'\n
    \n\n

    2) If the user authorizes your application, the user is redirected to your redirect URI, with an authorization code:

    \n\n
    https://<your registered redirect URI>/?code=<authorization code>\n
    \n\n

    The OAuth 2.0 authorization code is a 30-character, randomly generated string. It is used in the next step, a request made to the token endpoint in exchange for an access token.

    \n\n

    The response includes the state parameter, if it was in your request.

    \n\n

    In our example, your user gets redirected to:

    \n\n
    http://localhost/?code=394a8bc98028f39660e53025de824134fb46313\n    &scope=viewing_activity_read\n    &state=c3ab8aa609ea11e793ae92361f002671\n
    \n\n

    3) On your server, get an access token by making this request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    ?client_id=<your client ID>\n    &client_secret=<your client secret>\n    &code=<authorization code received above>\n    &grant_type=authorization_code\n    &redirect_uri=<your registered redirect URI>\n
    \n\n

    Here is a sample request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    ?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2\n    &client_secret=nyo51xcdrerl8z9m56w9w6wg\n    &code=394a8bc98028f39660e53025de824134fb46313\n    &grant_type=authorization_code\n    &redirect_uri=http://localhost\n
    \n\n

    4) We respond with a JSON-encoded access token. The response looks like this:

    \n\n
    {\n  \"access_token\": \"<user access token>\",\n  \"refresh_token\": \"<refresh token>\",\n  \"expires_in\": <number of seconds until the token expires>,\n  \"scope\": [\"<your previously listed scope(s)>\"],\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    In our example:

    \n\n
    {\n  \"access_token\": \"0123456789abcdefghijABCDEFGHIJ\",\n  \"refresh_token\": \"eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\",\n  \"expires_in\": 3600,\n  \"scope\": [\"viewing_activity_read\"],\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    OAuth client credentials flow

    \n\n

    As mentioned earlier, app access tokens are only for server-to-server API requests. The grant request below requires the client secret to acquire an app access token; this also should be done only as a server-to-server request, never in client code.

    \n\n

    1) On your server, get an app access token by making this request:

    \n\n
    POST https://id.twitch.tv/oauth2/token\n    ?client_id=<your client ID>\n    &client_secret=<your client secret>\n    &grant_type=client_credentials\n    &scope=<space-separated list of scopes>\n
    \n\n

    Here is a sample request:

    \n\n
    POST https://id.twitch.tv/oauth2/token?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&client_secret=nyo51xcdrerl8z9m56w9w6wg&grant_type=client_credentials\n
    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    client_secretstringYour client secret.
    grant_typestringMust be client_credentials.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    scopestringSpace-separated list of scopes.
    \n\n

    2) We respond with a JSON-encoded app access token. The response looks like this:

    \n\n
    {\n  \"access_token\": \"<user access token>\",\n  \"refresh_token\": \"\",\n  \"expires_in\": <number of seconds until the token expires>,\n  \"scope\": [\"<your previously listed scope(s)>\"],\n  \"token_type\": \"bearer\"\n}\n
    \n\n

    In our example:

    \n\n
    {\n  \"access_token\": \"prau3ol6mg5glgek8m89ec2s9q5i3i\",\n  \"refresh_token\": \"\",\n  \"expires_in\": 3600,\n  \"scope\": [],\n  \"token_type\": \"bearer\"\n}\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","getting-tokens-oidc":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    OIDC implicit code flow
    \n\t\t\n\t\t\t
    OIDC authorization code flow
    \n\t\t\n\t\t\t
    Claims
    \n\t\t\n\t\t\t
    UserInfo endpoint
    \n\t\t\n\t\n\n\n\t\t

    Getting Tokens: OIDC

    \n\n

    Introduction

    \n\n

    There are two OIDC procedures:

    \n\n
      \n
    • The OIDC implicit code flow gets ID tokens and optional user access tokens.
    • \n
    • The OIDC authorization code flow gets ID tokens and user access tokens.
    • \n
    \n\n

    See the Apps & Authentication Guide for an explanation of the different types of procedures.

    \n\n

    OIDC implicit code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. Then, an authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system. Use this request:

    \n\n

    GET https://id.twitch.tv/oauth2/authorize ?client_id=<your client ID> &redirect_uri=<your registered redirect URI> &response_type=<type> &scope=<space-separated list of scopes> &claims=<JSON object specifying requested claims>

    \n\n

    There are several required and optional query-string parameters:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringThere are two valid values: token id_token – Return an access token and an ID token (JWT). A given user is prompted to confirm authorization only on the first request. This should be URL encoded as token+id_token or token%20id_token. id_token – Return only an ID token. For example, a client with a valid access token, who only needs added information about the user authorizing it, might specify this option.
    scopestring

    Space-separated list of scopes. This must include the openid scope.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Optional ParameterTypeDescription
    claimsstring

    JSON object encoded as a string specifying the claims to be returned in the ID token and/or the UserInfo endpoint response.

    noncestringOIDC opaque value to avoid CSRF attacks. (Specifically, this is used to associate the client’s authorization session with an ID token, to avoid replay attacks.) This value is echoed back in the response. We strongly recommend you use this.\n
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to the user’s viewing activity (by specifying the viewing_activity_read scope) and email verification state, and send the user to http://localhost:

    \n\n

    GET 'https://id.twitch.tv/oauth2/authorize?response_type=token+id_token&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read+openid&state=c3ab8aa609ea11e793ae92361f002671&claims={\"id_token\":{\"email_verified\":null}}'

    \n\n

    2) If the user authorizes your application, the user is sent to your redirect URI, with an ID token and optionally an access token (if that was requested):

    \n\n

    https://<your registered redirect URI>#id_token=<an id token>&access_token=<an access token>

    \n\n

    The payload of the JWT that is returned includes several default claims about the OIDC ID token, plus any additional claims you requested:

    \n\n
      \n
    • \niss – Token issuer (Twitch)
    • \n
    • \nsub – Subject or end-user identifier
    • \n
    • \naud – Audience or OAuth 2.0 client that is the intended recipient of the token
    • \n
    • \nexp – Expiration time (note that when the JWT ID tokens expire, they cannot be refreshed)
    • \n
    • \niat – Issuance time
    • \n
    • \nnonce – Value optionally specified in the request
    • \n
    \n\n

    In our example, the ID token will have an additional claim, email_verified, because that was in the request.

    \n\n

    The ID and access tokens are in the URL fragment, not the query string, so they will not show up in HTTP requests to your server. URI fragments can be accessed from JavaScript with document.location.hash.

    \n\n

    The response includes the state parameter in the URL fragment and/or the nonce parameter in the ID token’s payload, if they were provided on your initial request.

    \n\n

    Here is a sample response with both an ID token and access token:

    \n\n

    https://localhost#access_token=0123456789abcdefghijABCDEFGHIJ &token_type=bearer &id_token=eyJhbGciOiJSUzI1NiIsImtpZCI6IjRvaXU4In0.eyJzdWIiOiJuZnlmZSIsImF1ZCI6ImltX29pY19jbGllbnQiLCJqdGkiOiJUOU4xUklkRkVzUE45enU3ZWw2eng2IiwiaXNzIjoiaHR0cHM6XC9cL3Nzby5tZXljbG91ZC5uZXQ6OTAzMSIsImlhdCI6MTM5MzczNzA3MSwiZXhwIjoxMzkzNzM3MzcxLCJub25jZSI6ImNiYTU2NjY2LTRiMTItNDU2YS04NDA3LTNkMzAyM2ZhMTAwMiIsImF0X2hhc2giOiJrdHFvZVBhc2praVY5b2Z0X3o5NnJBIn0.g1Jc9DohWFfFG3ppWfvW16ib6YBaONC5VMs8J61i5j5QLieY-mBEeVi1D3vr5IFWCfivY4hZcHtoJHgZk1qCumkAMDymsLGX-IGA7yFU8LOjUdR4IlCPlZxZ_vhqr_0gQ9pCFKDkiOv1LVv5x3YgAdhHhpZhxK6rWxojg2RddzvZ9Xi5u2V1UZ0jukwyG2d4PRzDn7WoRNDGwYOEt4qY7lv_NO2TY2eAklP-xYBWu0b9FBElapnstqbZgAXdndNs-Wqp4gyQG5D0owLzxPErR9MnpQfgNcai-PlWI_UrvoopKNbX0ai2zfkuQ-qh6Xn8zgkiaYDHzq4gzwRfwazaqA &state=c3ab8aa609ea11e793ae92361f002671 &scope=viewing_activity_read

    \n\n

    3) Validate the ID token. This is an important security measure to ensure the authenticity of the token and guard against any tampering.

    \n\n

    To verify the signature of our ID tokens, we host a public JSON Web Key (JWK) here. For details on how to use our JWK in validating ID tokens, see How to validate an OpenID Connect ID token.

    \n\n

    OIDC authorization code flow

    \n\n

    1) Send the user you want to authenticate to your registered redirect URI. Then, an authorization page will ask the user to sign up or log into Twitch and allow the user to choose whether to authorize your application/identity system. Use this request:

    \n\n

    GET https://id.twitch.tv/oauth2/authorize ?client_id=<your client ID> &redirect_uri=<your registered redirect URI> &response_type=code &scope=<space-separated list of scopes> &claims=<JSON object specifying requested claims>

    \n\n

    There are several required and optional query-string parameters:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Required ParameterTypeDescription
    client_idstringYour client ID.
    redirect_uriURIYour registered redirect URI. This must exactly match the redirect URI registered in the prior, Registration step.
    response_typestringThis must be code, causing an authorization code to be returned, which is used later in this procedure. A given user is prompted to confirm authorization only on the first request.
    scopestringSpace-separated list of scopes. This must include the openid scope.
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Optional ParameterTypeDescription
    claimsstringJSON object encoded as a string specifying the claims to be returned in the ID token and/or the UserInfo endpoint response.
    noncestringOIDC opaque value to avoid CSRF attacks. (Specifically, this is used to associate the client’s authorization session with an ID token, to avoid replay attacks.) This value is echoed back within the ID token. We strongly recommend you use this.\n
    statestringYour unique token, generated by your application. This is an OAuth 2.0 opaque value, used to avoid CSRF attacks. This value is echoed back in the response. We strongly recommend you use this.\n
    \n\n

    In our example, you request access to the user’s viewing activity (by specifying the viewing_activity_read scope) and email verification state, and send the user to http://localhost:

    \n\n

    bash GET 'https://id.twitch.tv/oauth2/authorize?response_type=code&client_id=uo6dggojyb8d6soh92zknwmi5ej1q2&redirect_uri=http://localhost&scope=viewing_activity_read+openid&state=c3ab8aa609ea11e793ae92361f002671&claims={\"id_token\":{\"email_verified\":null}}'

    \n\n

    2) If the user authorizes your application, the user is redirected to your redirect URI, with an authorization code:

    \n\n

    https://<your registered redirect URI>/?code=<authorization code>

    \n\n

    The OAuth 2.0 authorization code is a 30-character, randomly generated string. It is used in the next step, a request made to the token endpoint in exchange for access and ID tokens.

    \n\n

    The response includes the state parameter in the query string and/or the nonce parameter in the ID token’s payload, if they were provided on your initial request.

    \n\n

    In our example, your user gets redirected to:

    \n\n

    http://localhost/?code=394a8bc98028f39660e53025de824134fb46313 &scope=viewing_activity_read &state=c3ab8aa609ea11e793ae92361f002671

    \n\n

    3) On your server, get an access token and ID token by making this request:

    \n\n

    json POST https://id.twitch.tv/oauth2/token ?client_id=<your client ID> &client_secret=<your client secret> &code=<authorization code received above> &grant_type=authorization_code &redirect_uri=<your registered redirect URI>

    \n\n

    Here is a sample request:

    \n\n

    POST https://id.twitch.tv/oauth2/token ?client_id=uo6dggojyb8d6soh92zknwmi5ej1q2 &client_secret=nyo51xcdrerl8z9m56w9w6wg &grant_type=authorization_code &redirect_uri=http://localhost &code=394a8bc98028f39660e53025de824134fb46313

    \n\n

    4) We respond with a JSON-encoded access token and an ID token. The payload of the JWT that is returned includes several default claims about the OIDC ID token, plus any additional claims you requested:

    \n\n
      \n
    • \niss – Token issuer (Twitch)
    • \n
    • \nsub – Subject or end-user identifier
    • \n
    • \naud – Audience or OAuth 2.0 client that is the intended recipient of the token
    • \n
    • \nexp – Expiration time (note that when the JWT ID tokens expire, they cannot be refreshed)
    • \n
    • \niat – Issuance time
    • \n
    • \nnonce – Value optionally specified in the request
    • \n
    \n\n

    In our example, the ID token will have additional claim, email_verified, because that was in the request.

    \n\n

    Here is a sample response:

    \n\n

    json { \"access_token\": \"0123456789abcdefghijABCDEFGHIJ\", \"refresh_token\": \"eyJfaWQmNzMtNGCJ9%6VFV5LNrZFUj8oU231/3Aj\", \"expires_in\": 3600, \"scope\": [\"viewing_activity_read\"], \"id_token\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxNDk0MzkxNDQiLCJ1cGRhdGVkX2F0IjoiMDAwMS0wMS0wMVQwMDowMDowMFoiLCJpc3MiOiJodHRwczovL3Bhc3Nwb3J0LnR3aXRjaC50diIsImF1ZCI6IjJrOGl6MnE0eG1scDM2MmQyaWR5YzBoNnA0MmQxZSIsImV4cCI6IjIwMTctMDUtMDVUMjI6MzI6MjcuNzk1MzQxNjI1WiIsImlhdCI6MTQ5NDAyMjY0N30=.6HkHCuwUufojZn3ogeyl8Bi0J8IyVjIzrTLLR-v-MpmP2-EYExjVT_aPjoIfuOmfK2cCDCsGSRL-p7rtFamuv3e4v--S_TkhekLioAdL-9Nm-ZnX8kdys9XYLEf8acFkQOmQ2W5DLfm68u3zAmpRMXsq_LPcsWVbPe5AGZK4Tt5mS5JIK1S8VCPTQLc7__rMI_3Hzpij09fILlbaicAKPqybLnqfMowyemcWmrecseNc_Jig_ZpGm7RqNkbxctBIBDouB_rGtH1R1CwlDs_PE5pSq4I67G6aoL0P4aUIOpFCXxLU45975ZdQDRRq3o2Lqce6cmRLOemO5JSCyTGZhQ==\", \"token_type\": \"bearer\" }

    \n\n

    5) Validate the ID token. This is an important security measure to ensure the authenticity of the token and guard against any tampering.

    \n\n

    To verify the signature of our ID tokens, we host a public JSON Web Key (JWK) here. For details on how to use our JWK in validating ID tokens, see How to validate an OpenID Connect ID token.

    \n\n

    Claims

    \n\n

    Each claim describes a piece of data you want to get about the user authorizing your application. In the claims parameter of your OIDC request, you can choose to include any, all, or none of the claims. If you choose to omit any specific claims, we include several claims by default.

    \n\n

    Claims are requested by passing a claims parameter in the authorization request. These requested claims can be retrieved in the ID token itself or through the UserInfo endpoint. How data is returned for each claim varies, depending on the format of the claims parameter in the request.

    \n\n

    The claims parameter is a JSON object with two fields: id_token and userinfo. You may specify claims in both fields, and there is no requirement on presence or uniqueness of the claims in either field. For example, to include a user’s email and email verification state in the ID token and a profile image through the UserInfo endpoint, the claims parameter would be:

    \n\n

    { \"id_token\": { \"email\": null, \"email_verified\": null }, \"userinfo\": { \"picture\": null } }

    \n\n

    In the request, the claims parameter would be:

    \n\n

    claims={\"id_token\":{\"email\":null,\"email_verified\":null},\"userinfo\":{\"picture\":null}}

    \n\n

    The email and email_verified claims will be included in the ID token that is returned. The picture claim will be returned when you call the UserInfo endpoint with the OAuth token returned in the authorization request (assuming you requested an OAuth token in the flow with either the implicit or authorization code flow).

    \n\n

    You can request the following claims:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ClaimData
    emailEmail address of the authorizing user.

    email_verified

    Email verification state of the authorizing user.
    pictureProfile image URL of the authorizing user.
    preferred_usernameDisplay name of the authorizing user.
    updated_atDate of the last update to the authorizing user’s profile.
    \n\n

    Note: The email and email_verified claims will soon be gated by the user:read:email scope that must be included on the authorization request.

    \n\n

    The following claims are included by default in both the ID token and the UserInfo endpoint:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Default ClaimData

    aud

    Audience: client ID of the application requesting a user’s authorization.

    azpAuthorized party: client ID of the application which is being authorized. Currently the same as aud.
    expExpiration time of the token. This is in UNIX/Epoch format.
    iatTime when the token was issued. This is in UNIX/Epoch format.
    issIssuer of the token.
    subUser ID of the authorizing user.
    \n\n

    UserInfo endpoint

    \n\n

    The UserInfo endpoint allows you to fetch claims originally provided in the authorization request outside of the ID token. Note that this endpoint is available only if you receive an OAuth token on behalf of the authorizing user. If your authorization request specifies only the id_token response type, you will not have an OAuth token to call this endpoint.

    \n\n

    GET 'https://id.twitch.tv/oauth2/userinfo' -H \"Authorization: Bearer <OAuth token>\"

    \n\n

    The response is the requested claims (along with the default claims), in JSON form:

    \n\n

    { \"aud\": \"<your client ID>\", \"exp\": 1542051527, \"iat\": 1542050627, \"iss\": \"https://id.twitch.tv/oauth2\", \"sub\": \"<authorizing user ID>\", \"azp\": \"<your client ID>\", \"picture\": \"<authorizing user profile image>\" }

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\n\n\t\t

    Documentation Changelog

    \n\n\n\t\n\t\t\n\t\t\t\n\t\t\t\n\t\t\n\t\n\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\n
    DateDocumentation Changes
    2021‑02‑09\n

    In EventSub, the authorization scopes allowed for all Channel Point subscription types have been updated to accept channel:read:redemptions or channel:manage:redemptions.

    \n\n

    Updated Get Users to correctly document created_at in the example.

    \n\n

    Minor editorial updates to the Extensions Monetization Guide.

    \n
    2021‑02‑05\n

    Eventsub API endpoints have been moved to the API reference.

    \n\n

    A message regarding the deprecation of Twitch Quarterly Insights has been added to Insights following the recent announcement.

    \n\n

    Explicitly stating in Extensions that files should be zipped together as opposed to zipping the directory containing the files.

    \n\n

    Miscellaneous UserVoice and GitHub Issues addressed.

    \n
    2021‑01‑29\n

    EventSub

    \n\n\n

    A note about removing Extensions Policy 7.5 has been added since Twitch Extensions no longer load for banned users.

    \n\n

    The Drops guide now includes a section regarding thoughtful naming of campaigns and rewards.

    \n\n

    Product Lifecycle has been updated to include definitions for tagging functionality in the documentation.

    \n
    2021‑01‑28\n

    broadcaster_login and/or user_login added to multiple API endpoint payloads that already return user ID and display name.

    \n\n\n
    2021‑01‑22\n

    EventSub:

    \n
      \n
    • Corrected status value in examples.
    • \n
    • Clarified requirements for secret.
    • \n
    \n\n

    Authentication updates:

    \n
      \n
    • Correctly state a 400 Bad Request is returned when attempting to revoke an invalid token, rather than a 200 OK.
    • \n
    • Scope information corrections and updates.
    • \n
    \n\n

    Additional updates:

    \n
      \n
    • \noffset removed from Get Channel Followers endpoint in v5 as it is no longer supported. cursor should be used for pagination.
    • \n
    • Extensions tutorial updated to use Gists instead of image.
    • \n
    • Several UserVoice suggestions and GitHub Issues addressed.
    • \n
    \n
    2021‑01‑15\n

    New Twitch API endpoints available:

    \n\n\n

    The new scopes for these endpoints have also been added to Authentication. Updated the descriptions of existing scopes for consistency and accuracy.

    \n
      \n
    • channel:read:editors
    • \n
    • channel:manage:videos
    • \n
    • user:read:blocked_users
    • \n
    • user:manage:blocked_users
    • \n
    \n\n

    v5 migration guide updates:

    \n
      \n
    • New v5 scope mappings have been added for the above endpoints. See channel_editor, channel_read, user_blocks_read, and user_blocks_edit.
    • \n
    • Five endpoint equivalence definitions have been added for the above endpoints.
    • \n
    \n\n

    giantbomb_id set to 0 in the v5 Get Top Games response example to reflect a game data migration.

    \n
    2021‑01‑08\n

    EventSub updates:

    \n
      \n
    • Added support for filtering by type.
    • \n
    • Added user login to notification payloads.
    • \n
    \n\n

    Added twitch://broadcast mobile deeplink to broadcast a specific category.

    \n\n

    Embed updates:

    \n
      \n
    • \nenableCaptions() function, disableCaptions() function, and Twitch.Player.CAPTIONS event added.
    • \n
    • \nsandbox added for embedded chat.
    • \n
    • \ngetPlaybackStats() function and a description of the PlaybackStats object added back into the documentation.
    • \n
    • \nautoplay documentation updated to note the default value is false.
    • \n
    • Removed frameborder and scrolling from Twitch embed examples as these were deprecated in HTML5.
    • \n
    \n\n

    Feedback and bug reports:

    \n\n
    2020‑12‑18\n

    Updated auth validation sample with values and the expires_in field.

    \n\n

    Updated JavaScript helper examples to use window.Twitch.ext.

    \n\n

    Clarifcation for linking accounts for time-based Drops.

    \n\n

    Miscellaneous API reference fixes.

    \n
    2020‑12‑17\n

    Details for retriving ingest servers have been moved to the top-level Video Broadcasting section. This includes the launch of “Get Ingest Servers” to replace its deprecated version previously found in v5.

    \n
    2020‑12‑04\n

    UserVoice feedback fixes:

    \n\n\n

    Miscellaneous fixes:

    \n
      \n
    • Removed duplicate search results
    • \n
    • Displaying more search results
    • \n
    • Provided the full accept header in the v5 “Requests” section
    • \n
    • Changed the date format in the changelog to YYYY-MM-DD
    • \n
    \n
    2020‑12‑01\n

    Added progress field to Hype Train EventSub subscription types.

    \n
    2020‑11‑30\n

    Corrections and edits to the EventSub documentation.\nFixed a typo for “msg-param-gift-months” under IRC usernotices.

    \n
    2020‑11‑19\n

    Corrections and edits to the EventSub documentation.

    \n\n

    Updated Drops Analytics image.

    \n\n

    Changed type for pagination response field to be “object containing a string”.

    \n\n

    Corrections and edits to scopes documentation.

    \n
    2020‑11‑13\n

    Added documentation for EventSub.

    \n\n

    Added Channel Points API to the API Reference.

    \n\n

    Added a v5 to Twitch API migration guide.

    \n
    2020‑11‑04\n

    Added information about Drops Analytics to documentation.

    \n
    2020‑10‑29\n

    Removed CurseForge references from docs.

    \n\n

    API Reference:

    \n\n
      \n
    • Corrected token requirement for Get Stream Tags.
    • \n
    • Made sub-section ordering consistent, listing query parameters before body parameters.
    • \n
    • Corrected Modify Channel Information documentation which had body parameters listed as query parameters.
    • \n
    \n\n

    Pub Sub:

    \n\n
      \n
    • Updated user notices for multi-month subscriptions.
    • \n
    • Added sample code for multi-month subscriptions.
    • \n
    • Updated the topic for chat moderator actions.
    • \n
    \n
    2020‑10‑26\n

    API Reference:

    \n\n
      \n
    • Fixed issue causing apostrophes to show as random characters.
    • \n
    • Removed duplicate entry for Get Stream Tags.
    • \n
    \n\n

    Authentication Guide:

    \n\n
      \n
    • Added maximum OAuth token limits.
    • \n
    • Added channel:read:redemptions scope.
    • \n
    • Corrected the spelling of channel:manage:broadcast.
    • \n
    \n\n

    Clarified instructions for supplying parameters in the Webhooks Reference.

    \n\n

    Clarified limits in the Webhooks Guide.

    \n\n

    In the Extensions Guide, corrected the environment variable HTTPS=true for create-react-app.

    \n\n

     

    \n
    2020‑10‑09\n

    Updates to the API Reference:

    \n\n
      \n
    • Made example code consistent.
    • \n
    • Eliminated duplicate entry for the Get Stream Tags endpoint.
    • \n
    • Fixed typos.
    • \n
    \n\n

    Fixed a typo in the channel:manage:broadcast scope.

    \n\n

    Removed the Glossary.

    \n
    2020‑09‑23\n

    Removed links to internal documents in Increase Feedback in Extensions.

    \n
    2020‑09‑17\n

    Added to the v5 API Get Channel Subscribers endpoint the information that if a user in the subscribers list has been banned, the subscription information will be provided, but the user object will have a value of null.

    \n
    2020‑09‑15\n

    Edited all documentation to replace the terms “blacklist” and “whitelist” with “denylist” and “allowlist”.

    \n\n

    Edited and redesigned the top-level page:

    \n\n
      \n
    • Fixed broken links.
    • \n
    • Added links to UserVoice and GitHub for feedback and support.
    • \n
    • Removed outdated screenshots.
    • \n
    • Removed redundant links.
    • \n
    \n\n

    Added to the Get Clips endpoint documentation that clips are returned sorted by view count, in descending order.

    \n
    2020‑09‑14\n

    Updated the following endpoints to make clear they are about Bits codes:

    \n\n\n\n

    Updated Extensions documentation to say that layout needs to accommodate variable height rather than fixed at 700 pixels.

    \n
    2020‑09‑12\n

    Added discussion of subscription status support to the Extensions Monetization documentation.

    \n\n

    Clarified language in the Create Clip endpoint documentation.

    \n
    2020‑09‑07\n

    Documented authentication and Join rate limits for chat.

    \n\n

    Removed documentation for chat rooms, because the feature is deprecated.

    \n\n

     

    \n\n

     

    \n
    2020‑08‑28\n

    Removed mention of a webhook for Drops because it is not yet available.

    \n
    2020‑08‑25\n

    Updated the API Reference to note that the clips service returns a maximum of 1000 clips.

    \n\n

    Removed the deprecated information about rate limits when there is no token from the API Guide.

    \n\n

    Added pagination information to the Get Drops Entitlements endpoint documentation.

    \n
    2020‑08‑21\n

    Fixed code sample for Events-based Drops.

    \n
    2020‑08‑20\n

    Updated Authorization section for the Get Clips endpoint to indicate that a user access token is required.

    \n
    2020‑08‑18\n\n
    2020‑08‑13\n

    Added a new section to our Extension Submission Best Practices: Template for a helpful Walkthrough Guide and Change Log

    \n
    2020‑07‑30\n

    Updated Marketing and Developer User Roles.

    \n
    2020‑07‑30\n

    Updated Webhooks documentation to describe notification timeout.

    \n\n

    Changed documentation of Start Commercial response field from retryAfter to retry_after.

    \n
    2020‑07‑23\n

    Updated Extensions documentation to reflect new process for required review channels.

    \n
    2020‑07‑21\n

    Addressed issues in the API reference for the following endpoints:

    \n\n\n
    2020‑07‑06\n

    Added required authorization for the Get Streams endpoint and updated sample code.

    \n
    2020‑07‑01\n

    Added new fields to the Channel Subscriptions Event Pubsub topic and a new USERNOTICE tag parameter in support of Multi-Month Subscription Gifting.

    \n
    2020‑06‑22\n

    Updated the Authentication Guide to mention that developers can provide multiple redirect URIs.

    \n
    2020‑06‑22\n

    Bug fixes in the API Reference.

    \n
    2020‑06‑18\n

    Added new endpoints to the API Reference and Webhooks Reference:

    \n\n
      \n
    • Get Channel Information
    • \n
    • Modify Channel Information
    • \n
    • Search Channels
    • \n
    • Search Categories
    • \n
    • Get Stream Key
    • \n
    • Start Commercial
    • \n
    • Create User Follows
    • \n
    • Delete User Follows
    • \n
    • Get Cheermotes
    • \n
    \n\n

    Added new functionality to the API: the Hype Train API.

    \n
    2020‑06‑15\n

    Added links to rate limits documentation to the API Reference.

    \n
    2020‑06‑03\n

    Clarified the definition of Subscription denied in the Webhooks Guide.

    \n
    2020‑05‑12\n

    Removed documentation of MODE and NAMES in the IRC documentation because they have not functioned correctly for some time and will not be supported.

    \n
    2020‑05‑08\n

    Drops Guide: Updated Create Entitlement Grants Upload URL example to include Client ID.

    \n\n

    API Reference: Updated all example requests to include Client ID and token in Authorization header, as per new OAuth requirement.

    \n
    2020‑05‑04\n

    Fixed a bug in the API Reference. The optional scope for the Get Users endpoint should be user:read:email.

    \n
    2020‑05‑01\n

    Updated the Twitch API Reference to reflect that OAuth is now mandated.

    \n\n

    Updated the Authentication Guide to include new OAuth scopes. 

    \n\n

    Updated the Webhooks Reference to show that authorization is now required authorization for every web hook.

    \n
    2020‑04‑27\n

    Updated Extensions Best Practices: 

    \n\n\n\n

    Updated the Extensions Guidelines and Policies page for Content and Commerce.

    \n
    2020‑04‑20\n

    Updated Drops documentation to align with UI changes.

    \n
    2020‑04‑01\n

    Deleted documentation of these deprecated v5 endpoints: 

    \n\n
      \n
    • Get Channel Communities
    • \n
    • Set Channel Communities
    • \n
    • Delete Channel from Communities
    • \n
    \n\n

    Corrected URL for Get Extension Transaction endpoint.

    \n
    2020‑03‑30\n

    Updated definition of “language” in v5 Streams API Reference.

    \n
    2020‑03‑27\n

    Published new Extensions Guide.

    \n
    2020‑03‑18\n

    Updates to the Embedding Twitch documentation: 

    \n\n
      \n
    • Added new parent parameter.
    • \n
    • Removed deprecated getPlaybackStats method.
    • \n
    • Removed references to the font-size option for everywhere embeds.
    • \n
    \n
    2020‑03‑10\n

    Updated the Extensions Guidelines & Policies to add Moderation.

    \n
    2020‑02‑25\n

    Edited the following endpoints in the v. 5 API Reference:

    \n\n
      \n
    • \nGet Live Streams\n
        \n
      • Removed _total field
      • \n
      • Documented that the offset is capped at 900
      • \n
      \n
    • \n
    • \nGet Followed Streams\n
        \n
      • Removed _total field
      • \n
      • Documented that the offset is capped at 900
      • \n
      \n
    • \n
    \n\n

    Edited the Get Game Analytics endpoint to note that we only return data for the previous 365 days.

    \n\n

    Updated documentation for the sunset of Premieres.

    \n
    2020‑02‑14\n

    Updated the game_id parameter in the Get Streams endpoint from up to 100 IDs to up to 10 IDs.

    \n\n

    Documented the isBitsEnabled feature flag in the Extensions Reference.

    \n\n

    Removed the link to the deprecated form to increase webhook subscription limits.

    \n\n

    Added gifter_id and gifter_name fields to the Get Broadcaster Subscriptions endpoint and webhook.

    \n
    2020‑02‑13\n
      \n
    • Removed the live query string parameter from the Search Games endpoint documentation.
    • \n
    • Removed the popularity response field from the Search Games and the Get Top Games endpoint documentation.
    • \n
    \n
    2020‑01‑24\n

    Updates to PubSub documentation

    \n\n
      \n
    • Added Chat feature
    • \n
    • Added Required Scope for channel-bits-events-v1 and channel-bits-badge-unlocks\n
    • \n
    • Removed channel-commerce-events-v1 because it is deprecated
    • \n
    \n
    2020‑01‑10\n
      \n
    • Updated documentation to reflect that OAuth is the preferred method of authentication.
    • \n
    • Removed documentation for chat rooms because the feature is deprecated.
    • \n
    \n
    2020‑01‑08\n

    Extensions tutorials are now live on the site.

    \n
    2019‑12‑17\n

    Webhooks Reference

    \n\n
      \n
    • Updated description of Subscribe / Unsubscribe call to be more accurate about response codes and authentication required.
    • \n
    • Small syntax / formatting tweaks in the JSON examples.
    • \n
    • Mention the authenticated scopes needed for various authenticated webhooks.
    • \n
    \n\n

    Webhooks Guide

    \n\n
      \n
    • Clarified how retries are performed and how we handle non-2xx response codes from clients.
    • \n
    • Provided insight into the implementation of a handler for verification according to the W3C websub spec.
    • \n
    \n
    2019‑12‑16\n

    Added the Channel Points PubSub topic.

    \n
    2019‑12‑05\n

    Added chat rooms to the Product Lifecycle page as deprecated.

    \n
    2019‑12‑02\n

    Updated the Getting Tokens OIDC doc to note that the email and email_verified claims will soon be gated by user:read:email scope.

    \n
    2019‑10‑22\n

    Updated review section in Extensions Life Cycle Management doc to include review SLA.

    \n
    2019‑10‑16\n

    Added Product Lifecycle page to the site.

    \n
    2019‑09‑28\n

    Added links to the Developer Rig in these pages: 

    \n\n\n
    2019‑09‑11\n

    Added Increasing Feedback in Extensions.

    \n
    2019‑09‑10\n

    Removed communities-related data fields from Get Streams and Get Streams Metadata endpoints. These fields are no longer supported.

    \n\n

    Merged Get Broadcaster’s Subscribers into Get Broadcaster Subscriptions because they both return the subscribers to a channel. 

    \n\n

    Added Load Testing Extensions Using Locust and Elastic Beanstalk document.

    \n\n

    Added Submission Best Practices for Extensions.

    \n
    2019‑09‑06\n

    Corrected msg_id parameter type in Check AutoMod Status from integer to string.

    \n
    2019‑09‑04\n

    Added an updated Glossary.

    \n
    2019‑08‑22\n

    Edited the payload example in Topic: Subscription Events.

    \n
    2019‑08‑14\n

    Edited optional Create Stream Marker parameter description to include a max length of 140 characters.

    \n\n

    Removed “Increasing Feedback in Extensions”.

    \n
    2019‑08‑07\n

    Update Mobile Deep Links

    \n
    2019‑08‑05\n

    Updated Organizations (formerly “Companies”).

    \n\n

    Updated Extensions: Developer Rig

    \n\n

    Updated Extensions: Increasing Feedback in Your Extension.

    \n
    2019‑08‑04\n

    Add RBAC info to “Companies” (now “Organizations”)

    \n
    2019‑07‑31\n

    Added 2.10 and 2.11 to Extensions Guidelines and Policies.

    \n\n

    Updates to “Extensions: Designing” guide.

    \n
    2019‑07‑30\n

    Add RBAC information to Extensions Life Cycle Management and Monetization. 

    \n
    2019‑07‑29\n

    Corrected URL for endpoint Get Moderator Events.

    \n
    2019‑07‑22\n

    Extensions update - reset file ordering

    \n
    2019‑07‑19\n

    Retry adding 3 new Extensions docs (A/B Testing, Google Analytics, & Increasing Feedback)

    \n
    2019‑07‑18\n

    DA-430: Add three new Extensions documents: Using A/B Testing in Extensions, Using Google Analytics in Extensions, and Increasing Feedback in Extensions. Also made minor change in Drops (meaning of “retries”).

    \n
    2019‑07‑09\n

    Updated “Chatbots & IRC” docs (Getting Started, Guide, Membership, Commands, Tags, & Chat Rooms), except for “msg-ID Tags”.

    \n\n

    Updated all “Embed” docs (Introduction, Embed Chat, Embed Video & Clips, & Embed Everything).

    \n
    2019‑06‑27\n

    Added documentation for Get Subscription Events endpoint.

    \n\n

    Added documentation for Subscription Events webhook.

    \n
    2019‑06‑25\n

    Documented the new Moderation API.

    \n\n

    Documented two new webhooks:

    \n\n\n
    2019‑06‑21\n

    Insights & Analytics updates (twice today)

    \n
    2019‑06‑20\n

    Changed “position” to “policies” in Extensions: Guidelines and Policies, section 6.6.

    \n
    2019‑06‑19\n

    Added clarification to the Get Users endpoint in the Twitch API Reference that the limit of 100 IDs and login names is a total limit, not 100 of each.

    \n\n

    Changes to Helper Bits in the Extensions Reference:

    \n\n
      \n
    • The field should be “exp” rather than “expires”.
    • \n
    • Documented the domainID object.
    • \n
    • Edited definition of the product object.
    • \n
    \n
    2019‑06‑13\n

    Extensions Life Cycle Management: Added section on Control Security Policy (CSP)

    \n
    2019‑06‑07\n

    Removed deprecated Channel Feed API Reference.

    \n
    2019‑06‑06\n

    Extensions Guidelines & Policies:

    \n\n
      \n
    • Added policy 6.2.8.
    • \n
    \n
    2019‑06‑04\n

    Added Get Extension Transactions to the Twitch API Reference.

    \n\n

    Added Extension Transaction Created to the Webhooks Reference.

    \n
    2019‑05‑30\n

    Updated v5 API Guide: New third-party development will be limited to the API versions Kraken v5 and Helix. Limitation of new development will be enforced on client ID created on or after 5/31/2019.

    \n
    2019‑05‑08\n

    Removed orphan Bits Code Redemption Guide and added the content to the API Reference.

    \n\n

    Fixed date errors in the changelog.

    \n
    2019‑05‑07\n

    Fixed code formatting errors in several endpoints.

    \n\n

    Updated Configuration Service documentation.

    \n\n

    Removed Topic: Extension Analytics and Topic: Game Analytics from the Webhooks Reference because the endpoint is returning invalid data.

    \n
    2019‑04‑19\n

    Removed note that Webhooks parameters must appear in alphabetical order because that restriction no longer exists.

    \n\n

    Extensions Guidelines & Policies:

    \n\n
      \n
    • Added policies 1.5, 3.4, and 4.6.2.
    • \n
    • Appended 4.3 to mention Emotes usage and beta program.
    • \n
    • Appended 4.4 to mention advertising beta program.
    • \n
    • Removed 4.6.1 (Off-site links must be related to the extension’s core functionality).
    • \n
    • Removed 4.6.3 (Off-site links must be included within your URL allowlist).
    • \n
    • Previous 5.2 and 5.3 reworked and appended to mention the commerce beta program.
    • \n
    \n
    2019‑04‑18\n

    Updated link to download the Developer Rig for Windows.

    \n\n

    Updated the v5 API Reference to indicate that the version is deprecated.

    \n
    2019‑04‑16\n

    Deleted Communities Reference from v5 API because it is deprecated.

    \n
    2019‑04‑15\n

    Video: Updated Video Upload Guide and Video Reference to note that you must be a Partner or Affiliate to upload VODs.

    \n
    2019‑03‑27\n

    Chatbots & IRC: Twitch Tags: Added note that undocumented tags can be added/removed at any time. Also, tags may appear in any order. So, developers should write code to parse tags individually and ignore unrecognized tags.

    \n
    2019‑03‑26\n

    Chatbots & IRC: Twitch Tags: Added new badge-info parameter to GLOBALUSERSTATE, PRIVMSG, USERNOTICE, and USERSTATE.

    \n
    2019‑03‑18\n

    Getting Started with Extensions and Extensions Developer Rig: Changes based on the new Developer Rig UI. Updated “Hello World” example in Getting Started.

    \n
    2019‑03‑15\n

    Extensions Reference: Added information related to Monetization.

    \n\n

    Extensions Monetization Guide{: target=”_blank” (formerly Bits in Extensions), Extensions Life Cycle Management: Added Monetization tab to Extensions manager, for selecting Bits support and/or new subscription status support, and for going to the monetization onboarding process.

    \n
    2019‑03‑14\n

    Websub: Updated documentation to make it clear that the order of query parameters matters.

    \n\n

    Bits: Small edits to documentation, for clarity.

    \n
    2019‑03‑11\n

    Chatbots & IRC: Twitch Tags: Added several more msg-param parameters (for USERNOTICE).

    \n
    2019‑03‑08\n

    Chatbots & IRC: Twitch Tags: Deleted broadcaster-lang (from ROOMSTATE). Added several more valid values for the msg-id field (for USERNOTICE).

    \n
    2019‑03‑07\n

    Extensions doc set: Many changes. New version of Getting Started with Extensions. New Extensions manager UI (see Extensions Life Cycle Management).

    \n
    2019‑02‑21\n

    Insights & Analytics: Added mod author analytics.

    \n
    2019‑02‑08\n

    PubSub: Added topic channel-bits-events-v2. Removed deprecated months field. Added new cumulative-months and streak-months fields.

    \n
    2019‑02‑04\n

    Chatbots & IRC: Twitch Tags: For USERNOTICE, added three fields (msg-param-cumulative-months, msg-param-should-share-streak, msg-param-streak-months) and changed when msg-param-months is sent.

    \n
    2019‑01‑30\n

    Apps & Authentication: Added the scope channel:read:subscriptions.

    \n\n

    New Twitch API Reference: Added new endpoints: Get Broadcaster Subscriptions and Get User Subscriptions.

    \n
    2019‑01‑28\n

    Apps & Authentication: Clarified language around deprecation of Twitch API v. 5.

    \n\n

    Getting Started with Extensions: Clarified using the native Developer Rig (beta).

    \n
    2019‑01‑22\n

    Extensions Reference: Added locale parameter to “Client Query Parameters.”

    \n
    2019‑01‑18\n

    Extensions Developer Rig: Added section on “Enabling 2FA.”

    \n
    2019‑01‑17\n

    New Twitch API Reference: Added new endpoints: Replace Stream Tags, Get Stream Tags, and Get All Stream Tags. Updated Get Streams endpoint to document new tags functionality.

    \n\n

    Mobile Deep Links: Added deep links for category tags and live-stream tags.

    \n\n

    Insights & Analytics: Several clarifications, based on user feedback. Revised definitions of data fields that use device IDs. New section on “Counting Device IDs.”

    \n
    2018‑12‑21\n

    Getting Started with Chatbots & IRC: New version of this doc.

    \n
    2018‑12‑19\n

    Extensions Guidelines & Policies: New version of this doc.

    \n
    2018‑12‑17\n

    Code Redemption API: New reference document.

    \n
    2018‑11‑30\n

    Extensions Reference: Moved Bits-related reference information (JS helper functions) here, to consolidate all Extensions reference info in one place. The Bits in Extensions document is now purely a guide.

    \n
    2018‑11‑28\n

    Company Management: New document on registering companies and managing users in them. Company registration is required before you can manage games on Twitch or create Drops campaigns.

    \n
    2018‑11‑27\n

    Getting Started with Extensions, Extensions Developer Rig: Deleted information about the Developer Rig “local mode” (no longer available).

    \n
    2018‑11‑14\n

    Apps & Authentication: Getting Tokens: OIDC: Added claims and UserInfo endpoint.

    \n\n

    Chatbots & IRC Guide: Added scopes for /vip, /unvip, and /vips commands.

    \n\n

    Chatbots & IRC: Twitch Tags: In USERNOTICE, added anonsubgift.

    \n\n

    PubSub Guide: Added sample message for anonsubgift.

    \n
    2018‑11‑02\n

    Twitch IRC Capability: msd-ID Tags: This new document (under Chatbots & IRC) contains a complete (lengthy) list of all msg-id tags that apply to the NOTICE (Twitch Commands) and NOTICE (Twitch Chat Rooms) commands.

    \n\n

    Extensions Reference: New JWT schema field, is_unlinked.

    \n\n

    New Twitch API Reference: New description and example in Get Webhook Subscriptions, which requires a Bearer token.

    \n
    2018‑10‑24\n

    Extensions Guidelines & Policies: New version of this document.

    \n
    2018‑10‑23\n

    New Twitch API Reference, New Twitch API: Webhooks Reference: Added a display-name response field to several endpoints and webhooks. Endpoints affected: Get Bits Leaderboard, Get Clips, Get Streams, Get Streams Metadata, Get Stream Markers, Get Users Follows, Get Videos. Webhooks affected: Stream Changed, User Follows.

    \n\n

    Building Extensions: Added information about pre-release disclosures. 3/7/19 update: Moved to Extensions Life Cycle Mangement.

    \n
    2018‑10‑22\n

    Apps & Authentication Guide: In “Types of Tokens,” added a clarification about bearer tokens.

    \n\n

    New Twitch API Guide: New information in “Rate Limits.

    \n\n

    Getting Started with Extensions: Added the new Extensions Developer Sandbox.

    \n
    2018‑10‑16\n

    Extensions: Onboarding is now required only for monetization (Bits).

    \n\n\n
    2018‑10‑10\n

    Extensions: Added the new Configuration Service. See:

    \n\n
      \n
    • \nBuilding Extensions: New “Configuration Service” section.
    • \n
    • \nExtensions Reference:\n
        \n
      • Three new endpoints (Set Extension Configuration Segment, Get Extension Channel Configuration, Get Extension Configuration Segment).
      • \n
      • New Twitch Extensions configuration helper functions (see “Helper: Configuration”).
      • \n
      • Change to when Set Extension Required Configuration can be used.
      • \n
      \n
    • \n
    • \nExtensions Developer Rig: New Configuration Service tab.
    • \n
    • Releasing & Maintaining Extensions: Many updates. 3/7/19 update: Renamed Extensions Life Cycle Management.
    • \n
    \n\n

    Insights & Analytics: Added printing a poster view of Twitch Quarterly Insights.

    \n
    2018‑10‑09\n

    Chatbots & IRC: Twitch Commands, Chatbots & IRC: Twitch Tags: Added CLEARMSG, single-message removal on a channel.

    \n
    2018‑10‑02\n

    Drops Guide: Added recommendations for campaigns.

    \n\n

    Webhooks Reference: Clarified the functionality of the Stream Changed webhook (formerly called Stream Up/Down).

    \n
    2018‑10‑01\n

    Drops Guide: New functionality for creating and using items, with a new Item Manager page and new fields for items. See especially the section on using campaigns.

    \n
    2018‑09‑28\n

    Extensions Developer Rig: New document focusing on the rig. Also see changes to the Developer Rig section of Getting Started with Extensions.

    \n\n

    Extensions Reference: New hostingInfo property in the onContext JS helper function. New onHighlightChanged JS helper function.

    \n\n

    Apps & Authentication Guide: The chat_login scope is deprecated. See the section on new scopes for chat and PubSub.

    \n\n

    Chatbots & IRC Guide: New section on Scopes for IRC Commands.

    \n\n

    Mobile Deep Links: New section on launching the Twitch app with universal links (recommended).

    \n
    2018‑09‑14\n

    New Twitch API: Webhooks Guide: There are changes to subscription limits. Each client ID can have at most 10,000 subscriptions. Also, you can subscribe to the same topic at most 3 times.

    \n
    2018‑09‑11\n

    New Twitch API Reference: New optional query string parameters (started_at and ended_at) for Get Clips.

    \n
    2018‑09‑07\n

    Extensions Reference: New JS helper function, minimize. See Helper: Actions

    \n
    2018‑09‑06\n

    New Twitch API Reference: Added new endpoints, Create Stream Marker and Get Stream Markers.

    \n
    2018‑09‑04\n

    Insights & Analytics: Added three new clips fields to game-developer analytics.

    \n
    2018‑09‑03\n

    Getting Started with the New Twitch API: When registering your app, the app name must not include “Twitch” (as an exact or fuzzy match), or registration will fail.

    \n
    2018‑08‑30\n

    Extensions (several docs): Added pop-out Extensions. Start reading here in Required Technical Background (this links to relevant info elsewhere in the doc set).

    \n\n

    Extensions Reference: Added Send Extension Chat Message endpoint and Helper: Feature Flags (JS helper functions).

    \n
    2018‑08‑21\n

    Insights & Analytics: Added Twitch Quarterly Insights (fact sheet for games).

    \n
    2018‑08‑13\n

    Building Extensions: Due to requirements recently communicated to us by Apple, Extensions support on iOS devices (including the ability to test on iOS) is now restricted to Apple Developer Program members. See “Mobile Support.”

    \n\n
      \n
    • If you have released a mobile extension: Your extension no longer appears on iOS. Twitch will contact you soon about adding iOS support.
    • \n
    • If you develop a new mobile extension for iOS, please set up an Apple developer account (if you do not already have one), then contact Twitch (developer_support@twitch.tv) to add iOS support.
    • \n
    \n\n

    Extensions Reference: In Helper: Extensions, added new property (arePlayerControlsVisible) to the onContext JS helper function.

    \n
    2018‑08‑07\n

    Insights & Analytics: Added V2 of extension analytics.

    \n\n

    New Twitch API Reference: Updated the Get Extension Analytics endpoint for V2.

    \n\n

    New Twitch API: Webhooks Reference: Added new webhook, Extension Analytics.

    \n
    2018‑08‑02\n

    Chatbots & IRC: Twitch Tags: Marked some parameters as deprecated (subscriber, turbo, and user_type). Use the badges parameter instead.

    \n
    2018‑07‑31\n

    New Twitch API Reference: Added Get Webhook Subscriptions endpoint.

    \n
    2018‑07‑27\n

    Designing Extensions: Added more guidance for all extensions and panel extensions.

    \n
    2018‑07‑20\n

    Apps & Authentication: GuideGetting Tokens: OAuth, & Getting Tokens: OIDC: Added token_type parameter (required value = bearer) in several places.

    \n
    2018‑07‑19\n

    Bits in Extensions: New document.

    \n\n

    Extensions Guidelines & Policies: Added Bits in Extensions requirements.

    \n
    2018‑07‑12\n

    Twitch API v5 Channel Feed Reference: Changed (deprecated) most endpoint responses.

    \n
    2018‑07‑06\n

    Getting Started with Extensions, Building Extensions: Added information about the Twitch Developer Rig “local mode” (for local testing against mock, non-production endpoints).

    \n\n

    Extensions Guidelines & Policies: Added a note about which versions of Android and iOS must be supported by mobile extensions.

    \n\n

    Extensions Reference: Added two new fields to the onContext JS helper function (isMuted, volume).

    \n\n

    Apps & Authentication: Split this large document into several smaller docs, to make it easier to read and find information.

    \n
    2018‑06‑22\n

    Insights & Analytics: Added V2 of game analytics.

    \n\n

    New Twitch API Reference: Updated the Get Game Analytics endpoint, to enable selection of report version and date/time range.

    \n\n

    Chatbots & IRC Guide: Updated the information on “Connecting to Twitch IRC.”

    \n
    2018‑06‑19\n

    Extensions Reference: Expanded the definition of onPositionChanged JS helper function.

    \n\n

    Building Extensions: In “Local Test,” added information about the new Invite Only tab, for seeing allowlisted extensions in the Extensions Manager.

    \n\n

    New Twitch API Reference: Added three endpoints: Get User Extensions, Get User Active Extensions, Update User Installed Extensions.

    \n\n

    Apps & Authentication: Added new scopes, for new endpoints.

    \n\n

    Embedding Twitch: Everything: For the layout parameter, changed the valid value from video-and-chat to video-with-chat.

    \n\n

    Twitch API v5: In “Which API Version Can You Use?” indicated that there is no scheduled deletion date for v5.

    \n
    2018‑06‑07\n

    Embedding Video & Clips: In setVideo, added a new Timestamp parameter.

    \n\n

    Drops Guide: In “Next: Notify the Viewer about Drops,” added GUID to URLs.

    \n
    2018‑06‑04\n

    Having Extensions Reviewed: Before you submit an extension for review, you now select a category under which your extension will be shown in the Extension Manager and upload an image for “discovery” purposes. 3/7/19 update: This document was deleted; information is in Extensions Life Cycle Management.

    \n
    2018‑05‑31\n

    Getting Started docs:

    \n\n\n\n

    Extensions Reference: Changes to Send Extension PubSub Message (messages can be sent globally), listen and send JS Helper functions, and Example JWT Payload.

    \n\n\n\n

    New Twitch API: Webhooks Reference: Added two webhooks (User Changed, Game Analytics).

    \n\n

    Insights & Analytics: New doc, with information on both game developer analytics and extensions developer analytics. (Replaces the Game Developer Analytics doc.)

    \n
    2018‑05‑21\n

    Embedding Twitch and Chatbots & IRC: These large documents were spit into several smaller docs, to make it easier to read and find information.

    \n\n

    Extensions Reference: The onVisibilityChanged JS helper function now works with component extensions.

    \n
    2018‑05‑15\n

    Getting Started with Extensions: In “Procedure for Non-Twitch Partners/Affiliates,” the last step of beginning the onboarding process was changed.

    \n
    2018‑05‑09\n

    New Twitch API Reference:

    \n\n
      \n
    • In Create Clip, an optional query string parameter was added, has_delay. This adds a delay before the clip is captured to account for the brief delay between the broadcaster’s stream and the viewer’s experience of that stream.
    • \n
    \n
    2018‑05‑02\n

    Extensions: The Extensions Guide was split into several shorter docs. Look in the Extensions doc category.

    \n
    2018‑04‑29\n

    Updated Organizations documentation. 

    \n
    2018‑04‑19\n

    Embedding Video and Clips: In “Interactive Frames for Live Streams and VODs” > “Optional Parameter,” the default of the parameter playsinline parameter was changed to true.

    \n\n

    Extensions Guide: Video-component extensions were added. Broadcasters can activate up to six extensions at a time: 3 panel, 1 video overlay (full screen), and 2 video component (smaller).

    \n\n

    Extensions Reference: Info was added about video-component extensions (new JS Helper function, onPositionChanged).

    \n\n

    New Twitch API Reference: In Get Clip, 4 query params were added (broadcaster_id, game_id, before, after).

    \n
    2018‑04‑04\n

    Embedding Video and Clips: In “Events Emitted by and Defined by the Player,” a new  Twitch.Player.PLAYBACK_BLOCKED event was added.

    \n\n

    New Twitch API Reference: A “Resource” column was added to the summary table of endpoints, then endpoints in the doc were re-ordered to match the table (so endpoints for the same resource are in the same part of the doc).

    \n
    2018‑03‑29\n

    Apps & Authentication Guide: See new wording in “Validating Requests.”

    \n\n

    Embedding Video and Clips: In “Interactive Frames for Live Streams and VODs” > “Events Emitted by and Defined by the Player,” a new PLAYING event was added and the definition of the PLAY event was changed.

    \n\n

    Extensions Guide: In “Appendix B: Guidelines and Practices,” the policy for audio was revised: “Extensions can include audio only if they include controls which allow viewers to adjust the volume, and by default, these controls are set to off/muted.” 5/2/18 update: Now that the Extensions Guide is split up, this information is in Extensions Guidelines & Policies.

    \n\n

    Extensions Reference: Changes related to the introduction of dynamic anchors. Search for “anchor” in the doc.

    \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","companies":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Registering and managing organizations
    \n\t\t\n\t\t\t
    User Roles
    \n\t\t\n\t\t\t
    Why was my organization request rejected?
    \n\t\t\n\t\t\t
    Restrictions on billing managers
    \n\t\t\n\t\t\t
    Game management
    \n\t\t\n\t\t\t
    Extension monetization within an organization
    \n\t\t\n\t\n\n\n\t\t

    Organization Management

    \n\n

    Introduction

    \n\n

    This guide explains how to register a Developer Organization, which enables you to manage games and build Extensions in collaboration with other Twitch Developers. Organizations also have the ability to claim games on Twitch to manage game metadata (e.g., box art), get access to game analytics, and use the Drops product. For more about claiming games, see Game Management.

    \n\n

    Registering and managing organizations

    \n\n

    Before you start to manage games or build Extensions collaboratively, you must register your organization with Twitch. An organization (also known as a company) is loosely defined as a group of one or more people who have Twitch accounts and work together. Different users in an organization can have different roles, with each role providing a different level of control over a different aspect of the Twitch experience. The concept of an organization is especially useful for large groups with multiple teams, each of which needs access to different products on the Twitch console.

    \n\n

    Note: You must register an organization, even if you’re the only one in it.

    \n\n

    How to register an organization

    \n\n

    To register an organization:

    \n\n
      \n
    1. Go to your Twitch developer console:
      a. If you’re logged in, go to the console.
      b. If not, go to Twitch TV, then click Your Console (top right). 
    2. \n
    3. On the console homepage, you can click the CTA to register an organization. You can also click Create Organization on the top navigation. 
    4. \n
    5. \n

      On the registration page, fill out all fields:

      \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
      FieldDescription
      Organization NameName of your organization.
      Organization URLURL of your organization’s website. If you are providing games you would like to claim below, the organization URL domain must match the contact email domain, or your registration request will be rejected.
      Organization TypeDeveloper, Publisher, or Other.
      GamesTitles of games that your organization owns. Start typing and the form provides an auto-complete drop-down list of games known to Twitch.
      IndustryExamples: e-sports, gaming, health care, energy.
      What is the current size of your organization?Number of people in your organization.
      City, State, CountryLocation of your organization.
      First Name, Last Name, TitleContact information for the creator of the organization. This user is added to the organization as the owner. The email domain must match the organization URL domain, or your registration request will be rejected.\n
      What products are you interested in?Indicate which Twitch products you want to manage; for example, creating Drops, managing game box art, or accessing game Insights.
      What brought you to Twitch?Fill in as appropriate.
      \n
    6. \n
    7.  Click Submit.
      The button is clickable only after all fields are filled in (and assuming you do not have another registration submission in process). After you submit, a note appears, indicating your registration is pending. 
    8. \n
    9. Processing typically takes 2-3 business days, after which you will receive email with confirmation or rejection of your application:\n
        \n
      • If your registration is approved, you are added to the organization as an administrator and you can manage the other users in the organization.
      • \n
      • If your registration is rejected, you get an informative email. The most common reasons for rejection are: the organization URL and email domains do not match (if you are claiming a game), or the organization does not own the specified game(s). Please fill out the form again, correcting any errors, and resubmit.
      • \n
      \n
    10. \n
    \n\n

    User Roles

    \n\n

    Twitch Developers within an organization can be assigned these roles:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    RoleProduct ManagementUser Management
    OwnerCan manage games, access Game analytics, edit box art, and drop campaigns. Can manage Extensions.Can add and delete users of any role.
    AdministratorCan manage games, access Game analytics, edit box art, and drop campaigns. Can manage Extensions.Can add and delete managers, marketers, and developers.
    Billing Manager
     
    Can manage games, access Game analytics, edit box art, and drop campaigns. Can manage Extensions, including assigning themselves or other billing managers as payout entities for Extensions.Can add and delete managers, marketers and developers.
     
    ManagerCan manage games, access Game analytics, edit box art, and drop campaigns. Can manage Extensions.Can add and delete marketers and developers.
    MarketerCan access drop campaigns. Can also do anything as Developers, such as managing Extensions and Apps.
    \n
    Developer
     
    Can manage games, access Game analytics, edit box art, and drop campaigns. Can manage Extensions and Apps.
    \n\n

    Why was my organization request rejected?

    \n\n

    We intend for organizations to be a tool for developers, game publishers and studios, or for brands that work with Twitch solutions or products. We reserve the right to reject any organization request for any reason. Here are some common reasons why a request is rejected:

    \n\n
      \n
    • The organization name is too similar to an existing organization.
    • \n
    • We could not verify your ownership of any games claimed along with the application.
    • \n
    • If you have claimed a game, the organization URL does not match the email domain associated with your Twitch profile.
    • \n
    \n\n

    If you believe your application was rejected in error, please post a topic to our forums and a moderator and member of Twitch staff will be able to help. We apologize for any trouble!

    \n\n

    Accepting an invite to an organization

    \n\n

    If you have been invited to an organization by its administrator, you can accept an invitation as long as you are in no other organization.

    \n\n

    You will receive an invitation e-mail to the address associated with your Twitch account. You must have 2FA and a validated e-mail to register or join an organization. 

    \n\n

    Alternatively, you can access pending invites via the Manage Organizations button, located in the drop down menu in the console navigation. 

    \n\n

    If you decline an invite to an organization, the administrator must send you another invitation if you wish to join later. Invitations expire after 72 hours. 

    \n\n

    How to manage users

    \n\n

    To manage users:

    \n\n
      \n
    1. Ensure that any account you want to assign to a user role has a Twitch ID.
    2. \n
    3. Navigate to the console for your organization using the drop down in the navigation bar. 
    4. \n
    5. Click the Manage Members button on the Organization console homepage.
    6. \n
    7. On this page, you can filter by member name and by role. You can also sort by member name, role, and the date they were added to the organization.
    8. \n
    \n\n

    To add a user:

    \n\n
      \n
    1. Click the Add User button.
    2. \n
    3. Search for the Twitch username of the user.
    4. \n
    5. Provide the user’s name, and job title. 
    6. \n
    7. Select the role in which the user will be placed. Before you select billing manager, see Restrictions on Billing Managers.
    8. \n
    9. Click Add User. If not already in your organization, the user will be added and will be able to access the organization console after login. Until this point, their status will show as PENDING.
    10. \n
    \n\n

    To change a user’s role as an owner or administrator:

    \n\n
      \n
    1. Click Manage for the user who will receive the role adjustment.
    2. \n
    3. Select their new role in the drop down. If selecting billing manager, see Restrictions on Billing Managers below.
    4. \n
    5. Click Save. The role adjustment will occur immediately. 
    6. \n
    \n\n

    To delete a user, click the trash can to the right of the user’s name.

    \n\n

    Restrictions on billing managers

    \n\n

    Billing managers are Twitch account holders (or entities) that are eligible to receive Extension revenue payouts from Twitch. To be assigned this role, the Twitch account must:

    \n\n
      \n
    • Have 2FA authentication enabled on the account. This can be done via the settings page on a Twitch account on twitch.tv. 
    • \n
    • Completed Extensions Developer Onboarding. As Extension monetization within organizations is in limited preview, you will need to complete onboarding via the account’s personal console. In the future, we will enable onboarding via the organization console. To complete Extension Developer Onboarding:\n
        \n
      • Login to the Developer Console with the account you wish to make a billing manager.
      • \n
      • Navigate to an Extension with this account. If you do not have an Extension, create a new one. Use placeholder values and skip any optional fields required when creating the first version of this Extension.\n
          \n
        • This new Extension does not have to be used beyond the purpose of completing onboarding. Extensions you wish to manage collaboratively should be created within your Organization console. 
        • \n
        \n
      • \n
      • On any Extension (either the one you have created, or an existing Extension for that account), select a version in local test.
      • \n
      • Navigate to the monetization tab. Click the “Start Onboarding” button.\n
          \n
        • If the button shows “In Progress,” continue through to the onboarding screen and follow the prompts.
        • \n
        • If the button shows “Onboarding Complete,” your account should be eligible for the billing manager assignment within an organization. 
        • \n
        \n
      • \n
      • On this screen (located on the main twitch.tv website), you will have a series of steps to complete that ask for payout details. Complete the steps as appropriate for your organization’s accounting (or for yourself). 
      • \n
      • You can verify completion by returning to the monetization tab of an Extension version and observing that you can enable bits and subscription features on the Extension within the personal console. 
      • \n
      \n
    • \n
    \n\n

    Game management

    \n\n

    As a game publisher or developer, you can claim ownership of your game on Twitch.tv, allowing you to manage how it is displayed on the site, as well as view game developer insights (see Insights and Analytics). You can claim ownership of a game either via the registration form, or by clicking add game within the “games” tab or on the homepage of the Organization Console. 

    \n\n

    Note: Game ownership requests are verified within one week along with your request to create a new organization. The review team makes every effort to verify ownership using public information, but ownership requests can be denied if this is not possible. You can help our team by ensuring the Organization URL is accurate, that its domain matches your email domain, and that the information in the form can be cross-referenced with a verifiable source such as Giantbomb.com.

    \n\n

    Editing box art

    \n\n

    As an owner of a game, you may change the box art displayed on the Twitch.tv directory. Here are a few guidelines you must follow:

    \n\n
      \n
    • \nFrequency of changes: Box art should only be changed once every 30 days, and changes will take up to 24 hours to fully propagate on the site. 
    • \n
    • \nSize limitations: Box art must be less than 1 MB at a fixed resolution of 600x800 pixels. 
    • \n
    • \nArt requirements: Box art must be stripped of any logos or extraneous information aside from the game art and name of the game itself – any ESRB ratings, regulatory or similar information should be removed.
    • \n
    • \nTerms of service: Please review the Twitch Community Guidelines and Twitch Terms of Service. Any box art that violates these guidelines will not be approved.
    • \n
    \n\n

    Changes to other elements of your game’s presence on Twitch, including banner art or the name, must be submitted via a support request.    

    \n\n

    Accessing game developer insights

    \n\n

    As the owner of a game, you can access daily and quarterly insights on your game’s activity on Twitch. To learn more, see Insights and Analytics

    \n\n

    Extension monetization within an organization

    \n\n

    Organization owners can specify, on a per Extension basis, where any payouts will be received. 

    \n\n

    Note: If you have an existing Extension (with or without monetization enabled), our support team can migrate this Extension to your organization. The owner of the Extension must have a permission level of admin or higher in the destination organization.

    \n\n

    After adding a billing manager (see the previous steps), follow these steps to enable monetization on an Extension:

    \n\n
      \n
    1. Navigate to an Extension. On either the version listing page or the page of a specific version, click the Extension Settings button, under the main navigation bar.
    2. \n
    3. Near the bottom of this page, you can attach a billing user to the organization. This is required to monetize the Extension. \n
        \n
      • Only users set as a billing manager will appear in this drop down. The owner may also appear in this drop down, however, if the account has satisfied the conditions of the billing manager role (i.e., has 2FA enabled on the account and has completed Extensions Developer Onboarding).
      • \n
      \n
    4. \n
    5. Once you have made your selection, click the Set Billing Manager button. 
    6. \n
    7. Navigate to the latest version of an Extension. Then, select the Monetization tab.
    8. \n
    9. You can now set monetization options for the Extension.
       
    10. \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","drops":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Important Terms
    \n\t\t\n\t\t\t
    Prerequisites and Setup
    \n\t\t\n\t\t\t
    Entitlements API
    \n\t\t\n\t\t\t
    Definitions
    \n\t\t\n\t\t\t
    Create a Reward
    \n\t\t\n\t\t\t
    Create a Drops Campaign
    \n\t\t\n\t\t\t
    Time-Based Drops
    \n\t\t\n\t\t\t
    Event-Based Drops (Limited Access)
    \n\t\t\n\t\t\t
    Enabling a Drops Campaign
    \n\t\t\n\t\t\t
    Running a Successful Drops Campaign
    \n\t\t\n\t\t\t
    Conditional Drops Campaigns
    \n\t\t\n\t\t\t
    FAQ
    \n\t\t\n\t\n\n\n\t\t

    Drops Guide

    \n\n

    Introduction

    \n\n

    Twitch Drops enables you to grant in-game rewards to the Twitch community when streamers play your game or when they complete in-game missions, such as conquering a particularly difficult part of the game or by claiming victory during a battle royale game. Twitch Drops brings the Twitch community closer to your game, ultimately helping you acquire new players or re-engage your existing player base.

    \n\n

    The latest features of Drops provide a significant improvement in the viewer experience by:

    \n\n
      \n
    • Offering per-channel Drops prompts.
    • \n
    • Requiring viewers to claim their Drop reward on Twitch.
    • \n
    • Only requiring account connection after players claim a reward.
    • \n
    • Providing a Drops home where streamers and viewers can get more detail on a Drop campaign and the associated requirements and rewards.
    • \n
    \n\n

    Twitch Drops provides many features for your company to get started with minimal setup, thanks to a built-in Rules Engine and Entitlements Service. The Drops Rules Engine tracks viewer watch activity, only distributing rewards based on the timeline you specify. Using the Enhanced Experiences (E2) API (Limited Access), you can set up missions for streamers to complete in-game to trigger a Drop to viewers watching the event live. For time-based Drops, you set the amount of time viewers need to watch the game on participating channels, and then Twitch will handle tracking their progress. Once a rule has been satisfied by the viewer, or the missions achieved by the streamer, viewers will be able to claim the Drops rewards and generate an entitlement. The Twitch Entitlements Service provides an easy-to-use interface to retrieve all viewers that earned rewards by participating in your campaigns.  

    \n\n

    Important Terms

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TermDefinitionExample
    DropA collection of rewards distributed to viewers based on a drop rule during a specified time period.Limited Edition Soccer Balls
    Drop RuleThe conditions viewers or streamers must meet in order to trigger a Drop to be claimed by Twitch viewers watching a live channel that participates in Twitch Drops.\n

    Time-Based: Watch for 60 minutes

    \n

    Event Based: “Total Domination” - The streamer must score at least 10 goals while the opposing team scores less than 1 goal.

    \n
    RewardAn item that is granted by the company to viewers that are entitled to it. Typically, these are either consumables (e.g. coins), items (e.g. skins) or keys (e.g. beta-access keys).“Ultimate Ball”
    Drop CampaignA collection of Drops that are distributed during a specified time period. Drops within a campaign must fall within the bounds of a campaign. Campaigns enable conditional drop setups to reward the most loyal viewers of your content on Twitch.“Super Soccer 2020 Launch”
    EntitlementA unique identifier that tells developers which Twitch user earned a specific Drop (and its associated rewards) on Twitch.\n

      {

    \n

    \"id\": \"fb78259e-fb81-4d1b-8333-34a06ffc24c0\",

    \n

    \"benefit_id\": \"74c52265-e214-48a6-91b9-23b6014e8041\",

    \n

    \"timestamp\": \"2019-01-28T04:17:53.325Z\",

    \n

    \"user_id\": \"25009227\",

    \n

    \"game_id\": \"33214\"

    \n

    }

    \n
    Campaign Status\n

    Campaigns can be set to one of three states: 

    \n

    Disabled - The campaign is not visible on Twitch. Any fields can be edited.

    \n

    Test - The campaign is visible to Test viewers. Any fields can be edited.

    \n

    Enabled - The campaign is visible to all viewers on Twitch and channels on the creator allow list (or, all creators if no list is specified). There are three states that are computed based on the dates of the campaign when a campaign is enabled:

    \n
    • \nUpcoming - The campaign is enabled but the start time has not passed.
    \n
    • \nLive - The campaign is enabled and the present time is between the start and end time.
    \n
    • \nExpired - The campaign is removed from Twitch because the campaign end time has elapsed.
    \n
    \n


    \"disabled\"

    \n

    \"test\"

    \n

    \"enabled\"

    \n

    \"upcoming\"

    \n

    \"live\"

    \n

    \"expired\"

    \n
    \n\n

    Prerequisites and Setup

    \n\n

    Once a developer within your company sets up Twitch Drops, campaigns can be created and managed by anyone within the company. 

    \n\n

    Organization and Game Setup

    \n\n

    In order to use Twitch Drops, you must have a Twitch Developer Organization and have claimed your Game that your Drop rewards are associated with, which will be distributed during live campaigns when creators stream your game on Twitch. For more information, see Organizations to get started.

    \n\n

    Game ID

    \n\n

    You will need the numerical Twitch Game ID for your game to use Drops. You can find your game ID by calling the following API endpoint: 

    \n\n
    curl -H 'Client-ID: <your_client_id>' \\\n-H 'Authorization: Bearer <your access token>' \\\n-X GET 'https://api.twitch.tv/helix/games?name=<exact_game_name>'\n
    \n\n

    Create a Twitch Application for Drops

    \n\n

    Drops uses the Twitch API to inform your game’s identity and fulfillment services which Twitch viewers have authorized for you to grant rewards to their associated game accounts. You can use the same Twitch application to authenticate Twitch users with your account services and to access the Entitlements API. To create a Twitch application, see the Get Started Guide for the Twitch API.

    \n\n

    Whether you are creating a new Twitch application or using an existing one, you will need to identify which Organization will be using the application for Drops from the application management page. Go to your Developer Applications listing page and click the “Manage” button for the application you will be using. On this application management page, use the “Organization” dropdown to select the appropriate organization.

    \n\n

    \"New

    \n\n

    Next, make sure the client ID of your Twitch application is associated with your games on the Drops Settings page. Look for the following button on the “Drops Campaigns” tab of the Developer Console for your organization.

    \n\n

    \"Drops

    \n\n

    Click the “Edit Details” button next to the game that will be using your Twitch application. Enter the Client ID of your Twitch application, which can be found on it’s application management page.

    \n\n

    Account Linking 

    \n\n

    In order to claim in-game rewards, Twitch viewers will need to link their Twitch and game accounts. They do so by providing your game service with a Twitch account <> game account mapping. When viewers link their accounts, we recommend that you save the following information:

    \n\n
      \n
    • Game Account ID
    • \n
    • Twitch OAuth token
    • \n
    • Twitch Refresh Token
    • \n
    • Twitch User ID 
    • \n
    \n\n

    When a viewer or streamer links their account for the first time, we recommend that you call the Get Drops Entitlements API to pull all of their entitlements for your game. 

    \n\n

    While account linking can be achieved in-game, we also require that you host a webpage to let Twitch viewers link their accounts. You will need to add this URL to your reward configuration so that Twitch can redirect your viewers to the correct account linking page. 

    \n\n

    You can read more about account linking with OAuth on the Twitch OAuth Guide

    \n\n

    Entitlements API

    \n\n

    The Entitlements endpoint provides Developers using Drops with a way to obtain a list of entitlements that have been granted to a user by their Drops. For detailed information on using the API, see the Twitch API Reference.

    \n\n

    Definitions

    \n\n

    Benefit

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    benefit_idstringUnique identifier for this benefit. This is the ID that will be returned in the entitlement APIs.
    namestringName displayed to users on the site.
    descriptionstringDescription to be displayed to users on the site.
    image_assetimageImage to be displayed to the users on the site.
    limitintegerNumber of times a user can be entitled to the benefit.
    \n\n

    Entitlement

    \n\n

    An entitlement is the link between a User and a Benefit.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Field TypeDescription
    idstringUnique identifier of the entitlement.
    benefit_idstringIdentifier of the benefit
    timestampstringUTC timestamp in ISO format when this entitlement was granted on Twitch.
    user_idstringTwitch User ID of the user who was granted the entitlement.
    game_idstringTwitch Game ID of the game being played when the benefit was entitled.
    \n\n

    Track Entitlement Fulfillments

    \n\n

    We recommend that you track fulfillment for all rewards given out to game users. This will make sure that viewers receive their rewards. Here’s a simple sample data structure to track your entitlements. The entitlement ID is returned to you by the Get Drops Entitlements API. 

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Entitlement IDGame User IDOAuth TokenState
    NDQ5MjY1Mzc2fH...4LTBhNThhOWZlYWMyYQ==GameAccount1cfabdegwdoklmawdzdo98xt2fo512yCLAIMED
    NDQ5MjY1Mzc2fH...4LTBhNThhOWZlYWMyYQ==GameAccount1cfabdegwdoklmawdzdo98xt2fo512yFULFILLED
    NDQ5MjY1Mzc2fH...4LTBhNThhOWZlYWMyYQ==GameAccount1cfabdegwdoklmawdzdo98xt2fo512yEXPIRED
    \n\n

    Campaign Marketing Page

    \n\n

    You have the option of providing more information about your Twitch Drops Campaign by linking to a custom website, which will be available for the Twitch community to learn more about the event you are hosting. Typically this page includes more information about your event and how Twitch Drops will be a cornerstone of your marketing plan. For example, you may use Twitch Drops to drive viewers to watch your weekly developer diary stream on an upcoming game. The marketing page can tell viewers about the stream event, and can also inform them of the exclusive item you plan to give away.  

    \n\n

    Rewards Manager

    \n\n

    Before creating Drops Campaigns, you can use the Rewards Manager to set up the rewards you will associate to Drops that will be granted to Twitch viewers. Alternatively, you can add rewards while creating Drops within a campaign. When you create rewards via the Drops management interface, they will also be placed within the Rewards Manager.

    \n\n

    Create a Reward

    \n\n

    To create a reward, select the Rewards Manager within the Drops product via your Organization’s Console. Then, click the create new reward button to fill out the details of the item you will award to viewers who complete the Drops conditions (you’ll set these up later within a Drops Campaign). 

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Field NameDetails and UsageExample
    Reward ImageThis image will display within the notification call out when a Drop campaign is enabled, the streamer dashboard, and the inventory card UI when a viewer earns the reward. It must be a 160x160 px JPG or PNG, less than 1 MB in size. \"image
    Reward NameThe English name of the reward. In the future, we will allow localized names for rewards.Ultimate Ball
    GameThe game this reward is associated with. Games in this list must be owned by the organization and must have a Twitch Client mapped to it within Drops Settings.Super Soccer 2020
    Reward Connection URLThe URL viewers will go to link their Twitch account with your game’s identity service. Viewers expect that this identity link will provide the access needed to have the reward delivered to them after earning it on Twitch.https://supersoccer2020.com/link
    iOS Based RewardIf this reward is associated with an item that can be used within an iOS app or game, this field must be toggled ON. OFF
    Reward ID (optional)You can specify a unique ID for this reward, in case your game’s fulfillment service expects a certain identifier for the item granted. If you do not specify an ID, we will generate a GUID upon saving the reward on Twitch.398dnb-9kdlsnm-dasdfk2-doandbo3-onbm21
    \n\n

    After providing these details, saving the reward will make it available to any Drops added to a Drops campaign. 

    \n\n

    Note: You cannot edit rewards that have been distributed in a previously active campaign. 

    \n\n

    Create a Drops Campaign

    \n\n

    To run a Drop on Twitch, you will first need to set up a Drops Campaign, which allows you to schedule several Drops in advance of the event you’ll host for the Twitch community. Prior to launch, campaign information will be displayed for creators, so they can ensure their streaming schedules align with your event. You can run up to five Drops during a campaign, which can last for as long as you want to run the event. 

    \n\n

    Log on to the Twitch Developer Console and switch to your Organization’s console where you will create the campaign. Under the Drops product, select Create Drop Campaign. Add the following information that will be displayed for creators before, during and after your campaign:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Field NameDetails and UsageExample
    Campaign ImageThis image will be displayed for both viewers and creators before, during and after your campaign. It should visually summarize the event that your Drops will occur when creators stream your game on Twitch. It should be a 160x160px PNG or JPG and less than 1MB.\"image
    Campaign NameThis brief description gives streamers and viewers an overview of the campaign event. It can be no longer than 25 characters.“Super Soccer 2020 Launch”
    Start Date & Time, End Date & TimeThe duration of the campaign event. All of the Drops set up within the campaign must be within the time frame specified at the campaign level here. October 10th 2020 12:00PM to November 10th 2020 12:00PM
    GameThe game category creators must stream in order for Drops to be present on their channel. When a creator goes live during the campaign timeframe, viewers who visit the channel will have the ability to earn the Drops set up within the campaign.Super Soccer 2020
    Default Locale (coming soon)If viewers do not provide a locale, it will default to English. In the future, you will be able to provide localized names, descriptions and other information. English
    Drops Connection URLThe URL viewers must visit to link their Twitch account with your system which will fulfill the entitlements granted during the Drop Campaign. https://supersoccer2020.com/link
    Drops Detail URL (Optional)You can set up a marketing page to provide viewers and streamers more information about the campaign event, the rewards that they could earn, and the conditions required to earn the rewards.https://supersoccer2020.com/twitchdropslaunch
    Description (Optional)This description is visible on the Drops page within the creator’s dashboard. It should cover all of the details of the campaign to entice creators to play your game during the campaign time period.Super Soccer 2020 is an arcade style soccer game that lets you play as the game’s legends at the world’s greatest stages… or at the public park. During October, we’ll be giving away exclusive balls that unlock certain capabilities within the game, exclusive to our fans on Twitch. See you on the field!
    \n\n

    Once you create the campaign, you’ll be taken to the Campaign Details page where you can see a preview of how your campaign information and rewards will be presented to creators and viewers before, during and after the campaign. 

    \n\n

    Next, you will set up Drops that will be distributed to viewers during the campaign. You can add up to seven Drops, which can be distributed during continuous or concurrent time frames during the campaign. There are two types of Drops:

    \n\n
      \n
    • \nTime-Based Drops: Viewers can earn the rewards within the Drop if they watch streams with Drops enabled during the Drop time period. 
    • \n
    • \nEvent-Based Drops (Limited Access): Viewers can earn the rewards within the Drop if they witness the creator complete certain missions within the game during the Drop time period. This is powered by the Enhanced Experiences API, available in Limited Access to select publishers and developers.
    • \n
    \n\n

    After adding the Drops to your campaign, you can test the campaign to ensure it is ready for your event, and then enable the campaign for creators when the campaign start time occurs.

    \n\n

    Time-Based Drops

    \n\n

    Time-Based Drops distribute rewards when viewers have watched a creator stream your game for a specified amount of time. Twitch monitors the amount of time viewers spend across all channels streaming your game, so all you have to do is fulfill the rewards they are entitled to.

    \n\n

    Each participating streamer must connect their Twitch account with their game account for an associated Drops campaign to be active on their channel.

    \n\n

    Add a time-based Drop to an existing campaign

    \n\n

    Click on the Drops tab within a campaign and click the button to Create New Drop within the time-based card. Specify the name of the Drop and, optionally, provide alternative dates during which this specific Drop will be available during the campaign. You may wish to set one drop to occur during one week of a four week period, a second drop during week two, etc. 

    \n\n

    Once you create the Drop, you’ll be taken to the Rules tab of the Drop to set the amount of time viewers must watch a creator streaming the game to earn the Drop Rewards. After selecting a time period, all you have to do is add the items to distribute when the condition has been met, and then you are ready for testing.

    \n\n

    Time-based Drops support setting pre-requisite Drops that must be completed and claimed first before unlocking the ability to make progress toward another drop. Please see the Conditional Drops section for more details.

    \n\n

    Note: We recommend setting the watch time long enough for viewers to get a sense of the game, but not too much time that would demotivate them from earning your reward. Most campaigns set the watch time rules to be between the minimum of 15 minutes and the maximum of 4 hours. 

    \n\n

    Add Rewards

    \n\n

    Rewards are the items you will distribute to viewers after they have watched channels within the game category for the time specified in the Rules tab. You can add up to 3 rewards to a campaign, all of which will be dropped upon completion of the rule. You can add rewards either in-line during the Drop creation, or from the Reward Manager

    \n\n

    Rewards can be anything from in-game items (e.g. a limited edition ball), consumable items (e.g. coins or points) or access to a game (e.g. beta access via a direct entitlement). Most Drops users distribute exclusive rewards you can only get on Twitch, distributing more rare items based on the difficulty of the rule specified. 

    \n\n

    Test the Drop

    \n\n

    We strongly encourage testing any Drop before you activate it as part of a Drops Campaign. To make sure your event is kept a surprise to the community, you can use two access lists to limit the number of accounts who can preview the Drop before it goes live to all viewers and creators. 

    \n\n

    Specify Test Viewers and Creator Access

    \n\n

    Click on the Access tab within a campaign and you will see two sections: Test Viewers and Creator Campaign Access. Test Viewers can participate in drop campaigns when the campaign status is in the test state. To specify test viewer(s), input their username(s) within the Test Accounts.

    \n\n

    Creator Campaign Access allows you to specify creators whose communities can participate in your drop campaign. To specify creator(s), make sure Available for allow list channels is checked and the creator(s) username is entered amongst the Allow List Channels. The allow list is only valid when the campaign status is in test or active state.

    \n\n\n\n

    Using one of the accounts that will watch your test stream, test out your account linking flow.

    \n\n

    Stream on a linked streamer account 

    \n\n

    Start streaming on Twitch using the streaming account you linked previously. 

    \n\n

    Claim the drop with a test viewer and creator channel

    \n\n

    Test that the user is able to claim an entitlement on Twitch. 

    \n\n

    Verify the Entitlement was granted by Twitch

    \n\n

    When a viewer claims a Drop, you can call the Entitlements API to get viewer entitlement data. 

    \n\n

    Award a test Entitlement to the Twitch viewer

    \n\n

    Make sure you are able to process entitlements and track fulfillment for your test users. 

    \n\n

    Grant item in-game

    \n\n

    Test that the user is able to claim an entitlement in-game. 

    \n\n

    Event-Based Drops (Limited Access)

    \n\n

    Event-Based Drops trigger when the streamer completes a set of conditions (i.e. missions) you specify within the rules engine. For example, you can reward viewers with a limited edition weapon when the streamer wins a match without taking any damage.

    \n\n

    Note: This capability is powered by the Enhanced Experiences API, available in limited access to select Twitch Organizations. Please reach out to your Twitch contact to get started with Enhanced Experiences.

    \n\n

    Add an event-based drop to an existing campaign

    \n\n

    Within a Drops Campaign, select Drops and add a new Event-Based Drop. Once you create the Drop, you’ll be automatically navigated to the Rules tab. Here’s you’ll set up the event-based rule that must be satisfied to trigger the Drop to viewers on Twitch.

    \n\n

    Set up an event-based rule

    \n\n

    Event-Based rules require a Twitch Application Client to be allowlisted for access to E2. Select the E2 Client that the rules engine should expect a game state payload from to match against the rule specified within this form. The following table describes the remaining fields required to complete the rule setup:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Field NameDetails and UsageExample
    Mission NameOn Twitch, the community knows the Drop occurs during an event when a notification appears that the streamer must complete a “mission” to earn the rewards for the event. 

    The mission name is the short description for the mission to be completed by the streamer. This will be visible in their upcoming campaigns list, and also will be visible in the preview notification sent to viewers watching a live stream with the Campaign Enabled.
    \"Total Domination”
    Mission DescriptionThe mission description describes the state that must be detected by E2 (and thus, the set of conditions that the creator must pass) to trigger the drop. This mission is shown to creators within the campaign details page on the creator dashboard. “The streamer must score at least 10 goals while the opposing team scores less than 1 goal.”
    Drop Claim DurationThe amount of time the viewer has to claim the Drop after the mission has been completed by the creator streaming the game on Twitch. We recommend the default 2 minute allotment set within this form.2 minutes
    Event Rule(s)\n

    Each event rule is a pairing of a game state, a conditional operator, and value associated to the game state. You can add multiple event rules to a single Drop, which will likely make the mission harder to complete for the streamer

    \n

    All rules must be satisfied to trigger the Drop. 

    \n
    \n

    Rule 1: RedTeamScore is greater than or equal to 10

    \n

    Rule 2: BlueTeamScore is less than or equal to 1

    \n
    JSON Entry for Rule ValidationBased on the event rules specified, this field will auto populate a sample game-state JSON payload to send via the E2 API. Developers must submit this set of key-value pairs exactly to trigger the Drop, but they can exist alongside several other key-value pairs that describe the rest of the game state.
    {“RedTeamScore” : 5,\n\n“BlueTeamScore” : 4,\n\n“GreenTeamScore” : 10\n\n}
    \n\n

    After filling out the rule, save changes and it will be available for testing when the campaign is in the test status. If you filled out this section on behalf of your development or platform team, be sure to send them the JSON entry generated after saving changes to ensure the drop triggers successfully when the creator completes the mission.

    \n\n

    Add Rewards

    \n\n

    As with time-based drops, you can add up to 20 rewards to be distributed once the event-based rule is satisfied by the creator. These rewards can be added in-line or via the reward manager. 

    \n\n

    Test the Drop

    \n\n

    As with time-based drops, the testing flow is similar: after setting the campaign into the test status, you will watch a testing channel with a test viewer account and await the rule condition to be met. You can test the Drop trigger by actually completing the condition in the game (thus sending the correct payload via the Enhanced Experiences API), or simulating the game state by sending the correct payload by posting to the Enhanced Experiences API directly. In either case, the game state event should trigger the drop claim notification; claiming the entitlement will update the Entitlements API endpoint with the associated viewer and drop earned.

    \n\n

    Sending a test game state to the Enhanced Experiences API

    \n\n
    {\"connect\":{\"token\":\"xyz2j1sjzo8mhmbczowue123pqrst\",\"session_id\":\"{4022E85A-X782-9613B-23E1-5A3773FFACDC}\",\"game_id\":\"123456\", \"data\":{{\"RedTeamScore\":5,\"BlueTeamScore\":4,\"GreenTeamScore\":10}}}\n
    \n\n

    Enabling a Drops Campaign

    \n\n

    Once you have added the Drops to the campaign and tested them within your company, you are ready to go live! Click Change Status to select the Enabled state. You will see a preview sheet of the campaign, which you can use as a last minute checklist for the details and drops you have set up for this campaign. 

    \n\n

    Once you set the status to enabled, you will see one of three states:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    StateVisibilityCampaign Edit Restrictions
    \nUpcoming: The start time is in the future.Creators will be able to view campaign details in the creator dashboard.Campaign details can be changed.

    The start date can be moved up to the present.
    \nLive: The start time is in the past and the end time is in the future.Creators will be able to view the campaign details in the creator dashboard.

    Viewers will see the game has Drops Enabled in the Twitch directory.

    Channels streaming the game live will show Drops Enabled.

    Viewers following streamers that go live with your title that has a campaign enabled will receive a notification encouraging them to tune in.
    No changes can be made to any campaign or drop details.

    The end date can only be moved to a future date.
    \nExpired: The end time is in the past.The campaign will be hidden from all views. Any rewards earned by viewers will remain within their inventory, if they have earned them or claimed them already. No changes can be made to any campaign or drop details.
    \n\n

    Running a Successful Drops Campaign

    \n\n

    A Drops campaign is most effective in conjunction with a marketing that drives interest to your campaign on Twitch. Throughout your game’s lifecycle, you can use Drops campaigns to attract new player interest in your title, or reward your most loyal fans. Here are a few tips to ensure your Drops campaign resonates with the Twitch community and excite your player base.

    \n\n

    Create a Gaming Moment

    \n\n

    Run a Drops campaign during a major moment for your game, such as its world premiere, beginning of open beta, or the release of a new trailer. With Twitch Drops, viewers can link their account to your identity system in advance of your game’s launch. You can seed viewer excitement with exclusive content that they will have available at Day 1 of launch.

    \n\n

    Be Thoughtful with your Campaign and Reward Names

    \n\n

    Clear naming of your campaign and campaign rewards make for a better experience for users. Consider using nomenclature your community is familiar with so there is a clear understanding of what the campaign is, and what rewards can be earned. As an example, a campaign name of “The Cool Game Winter Challenge Event” where you can earn “500 Super Gems” clearly illustrates what campaign is running and what rewards viewers can earn.

    \n\n

    Celebrate a Community Achievement

    \n\n

    With Event-Based Drops, you can challenge creators to show off their skills and showcase the best of your game to the world. When a creator earns that hard fought victory, completes a devastating level or beats a major boss, you can trigger a Drop to generate a big moment around your game. 

    \n\n

    Make Drops Rewarding

    \n\n

    To make the biggest impact for your Drops Campaign, providing the rewards that excite your community is critical to achieving success.  Creating exclusive rewards such as beta access or a unique skin that can only be achieved through Drops will drive your audience to participate and attract new potential fans.

    \n\n

    Be the First to Give News and Updates

    \n\n

    Many developers use Twitch to showcase the latest updates in their game as part of a regular diary stream. You can set up Twitch Drops to be available during these streams, driving viewership to your show while showing off your latest release.

    \n\n

    Conditional Drops Campaigns

    \n\n

    Within a Campaign, you can chain together Drops of the same type to create a conditional Drops pattern, which you can use to award increasingly rare items as the community completes more difficult challenges. This feature is also useful to encourage more interaction with a campaign by requiring more touch points and claim events for the user as they complete the different Drops in a campaign.

    \n\n

    To set up a Conditional Drop Campaign, select a Drop within your campaign and, under Drop Details, toggle the Drop Condition and then select which Drop must be triggered before this Drop is available to viewers next.

    \n\n

    Sample Campaign Structure

    \n\n

    \"screen

    \n\n

    Using the Drop Dependency Tool

    \n\n

    You can use the specific tool to visually specify the conditional pattern Drops will follow during the campaign. Select the Drops tab within the Drops Campaign and click the button to Modify Drop Dependency to get started. 

    \n\n

    In the interface that pops up, you can click and drag drops, or use the arrow icons, to create a dependency pattern. A Drop Campaign can only have up to seven drops. In other words, Event-Based Drops cannot be dependent on time-based Drops. 

    \n\n

    FAQ

    \n\n

    Will Twitch Drops increase the rank of my game in the Twitch directory?

    \n\n

    In conjunction with a strategic marketing campaign, Twitch Drops are effective in enticing creators to play your title and motivate viewers to check out your game on Twitch. We recommend working with our creators in advance of the campaign to make sure they can show off the best of your game during the Drops Campaign. We also recommend using other social channels to inform viewers about the Drop in advance.

    \n\n

    Where can I get support for Drops?

    \n\n

    We recommend reading the Twitch Developer Playbook to see how Drops fits in as part of a broader set of strategies to grow your game’s engagement on Twitch. 

    \n\n

    To get additional support, see this page for all the resources available to you, including access to our Developer Forums and Developer Discord.

    \n\n

    How do I remove an account link?

    \n\n

    Since account linking is maintained by you, you will need to remove links between a Twitch account and a game account. We also recommend that you also revoke the OAuth access token

    \n\n

    What type of rewards can I give out?

    \n\n

    While we do not have specific recommendations on the types of rewards to give out, we do recommend that you avoid stackable/transferable Drops items, as this encourages farming behavior in which viewers create multiple accounts and watch different channels from multiple browser windows. 

    \n\n

    How do I handle account de-linking by users?

    \n\n

    It is important to think about how to handle users disconnecting their Twitch account from your game account. To check if a user has disconnected their account, you can check the validity of their OAuth token. 

    \n\n

    Here are some recommendation on to handle account relinking by users:

    \n\n
      \n
    • Remove in-game entitlements for any game user accounts who unlink their account, in order to discourage them from farming for the same reward using different Twitch accounts. 
    • \n
    • Any user that has linked their Twitch account to their game account and fulfilled in game content cannot relink the same Twitch account to a second game account and fulfill the same in-game item. 
    • \n
    • A user who has linked their Twitch account to their game account cannot fulfill additional in-game content by unlinking and linking another entitled Twitch account to the same game account. 
    • \n
    • A user who has linked their Twitch account to their game account cannot transfer fulfilled goods to another game account (e.g. Steam marketplace, transfer content to another game account).
    • \n
    \n\n

    How do I handle banned/suspended Accounts?

    \n\n

    If an account is banned or suspended, the OAuth token is invalidated. Please check the validity of a user’s (streamer or viewer) OAuth token before granting in-game items. 

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","legacydrops":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Set up Drops for your organization
    \n\t\t\n\t\t\t
    Viewer Heartbeat Service (VHS) data
    \n\t\t\n\t\t\t
    Test Drops VHS connectivity
    \n\t\t\n\t\t\t
    Managing Drops campaigns
    \n\t\t\n\t\t\t
    Notify the viewers about earned Rewards
    \n\t\t\n\t\n\n\n\t\t

    Legacy Drops Guide

    \n\n

    Introduction

    \n\n

    Drops enables you to grant in-game rewards to the Twitch community for watching streams of your game. For example, you can reward viewers with exclusive in-game content, or distribute beta keys to viewers as part of your announcement event. These rewards bring viewers closer to your game, ultimately helping you acquire new players or re-engaging your existing player base.

    \n\n

    There are several visual indicators of Drops:

    \n\n
      \n
    • The browse directory (categories) page indicates whether Drops are available to all channels streaming the game. If your Drops campaign is available only to white-listed channels, no indicator is displayed. 
    • \n
    • The game directory (category) page indicates whether Drops are available to all channels broadcasting the game. If your Drops campaign is available only to white-listed channels, no indicator is displayed.
    • \n
    • If a channel is Drops-enabled, the channel page tells viewers whether:\n
        \n
      • They are eligible (all set up) to receive Drops.
      • \n
      • They must create a Twitch account or link their Twitch and game accounts, to be eligible for Drops.
      • \n
      • The broadcaster has opted out of Drops.
      • \n
      \n
    • \n
    \n\n

    Drops functionality is powered by:

    \n\n
      \n
    • \nTwitch Authorization, which allows your players to log in to other applications with their Twitch credentials.
    • \n
    • The Twitch Viewer Heartbeat Service (VHS), a data-reporting service that sends JSON data about a user’s viewing activity to an HTTPS endpoint you host. You can use the incoming identities to select users for content entitlements and reward them as desired. To know which customers are watching your game on Twitch, your website or the game must integrate with Twitch Authorization.
    • \n
    \n\n

    Set up Drops for your organization

    \n\n

    To use Twitch Drops, you must have a Twitch Organization and have claimed a game on Twitch. If this is your first time using the Twitch developer site, register your organization and game with Twitch. See the Organizations Guide for more information.

    \n\n

    Step 1: Set up Twitch Authentication

    \n\n

    Follow the steps in the Authentication Guide to:

    \n\n
      \n
    • Obtain a clientID from your personal console (Under Applications - This module is currently not supported in your organization console.). Registration allows you to obtain a client ID and client secret. Retain your Client ID.\n
    • \n
    • Get a user access token. When you authenticate on behalf of a user, you are granted an access token that uniquely identifies to us your client and the Twitch user. This includes specifying scopes, the permissions you are allowed on behalf of an authorized Twitch user. To use the VHS endpoint, specify the viewing_activity_read scope when you request a token. Securely store this token.\n
    • \n
    • \nSend the access token in your API requests to authenticate.
    • \n
    \n\n

    Step 2: Create an endpoint to receive VHS data

    \n\n

    Create an HTTPS endpoint to receive the VHS data. You use the posted data and incoming identities to select viewers and broadcasters for in-game rewards.

    \n\n

    After we POST VHS data, we expect a 2XX status code in response. If one of these response codes is not returned, we retry up to three times, with a 15-second timeout. If the call and three retries fail, we stop sending that report (and all subsequent reports for that minute of time) and try again in the next minute, with the data at that time.

    \n\n

    Step 3: Manage Drops settings

    \n\n
      \n
    1. Log onto the Twitch Developer Console.
    2. \n
    3. Switch the console for the organization you wish to manage your Drops. Click View All within drops.
    4. \n
    5. Click Drops Settings, then enter the requested fields for VHS configuration:\n
        \n
      • \nClient ID — From the authentication step above.
      • \n
      • \nEndpoint — Your HTTPS endpoint for receiving the VHS heartbeats.
      • \n
      \n
    6. \n
    7. Save your changes.
    8. \n
    9. If you check the checkbox that says”Send periodic VHS reports…”, VHS will emit heartbeats. (Uncheck this box if you want to stop receiving heartbeats.)
      Save your changes.
    10. \n
    11. Click Submit.
    12. \n
    \n\n

    Step 4: Request VHS data from users

    \n\n

    Once users, both viewers and broadcasters, link their Twitch and game accounts, use the Create User Connection to Viewer Heartbeat Service (VHS) endpoint to create a VHS mapping and request VHS data.

    \n\n

    Broadcasters must go through the same linking process. For broadcasters who have not linked their Twitch and game accounts, heartbeats are not sent and as a result, those broadcasters’ viewers will not receive Drops.

    \n\n

    That’s it, you’re set up for Drops!

    \n\n

    Viewer Heartbeat Service (VHS) data

    \n\n

    Twitch will POST the VHS data to your designated HTTPS endpoint every minute, on each reported channel. The data is provided in JSON format. It is a fault-tolerant system that retries if there is an error in data transport.

    \n\n

    Each minute, for each developer, we start sending reports. Reports are sent one channel at a time. We continue until we receive, from the developer’s endpoint, a success response, a failed response, or a timeout.  The timeout is set for 15 seconds (so an initial try up to three re-tries take one minute). If a given channel fails all four times in a given minute, we stop sending reports until the next minute.

    \n\n

    A channel is a Twitch stream that has a broadcaster and one or more viewers. We only broadcast live data. Moreover, we only send data if the broadcaster has established an account link and there is at least one viewer who has also established an account link. Those are the criteria for selecting a channel for reporting. You can specify which channels will inform users of Drops becoming available, but VHS data will be available for all channels that have an established account link.

    \n\n

    There is a unique JSON object for each broadcaster. Here is a sample JSON post:

    \n\n
    {\n    \"broadcaster\": \"broadcaster-id-0000\",\n    \"broadcast_id\": 27388295120,\n    \"viewers\": 6,\n    \"viewer_list\": [ \"viewer-id-0000\", \"viewer-id-0001\", ...],\n    \"game\": \"GameName\",\n    \"version\": 1,\n    \"id\": \"f0bacda2-0e39-47ca-8bf0-44e3ab32be08\",\n    \"time\": \"2006-01-02T15:04:05Z07:00\",\n    \"retries\": 0\n}\n
    \n\n

    Where:

    \n\n
      \n
    • \nviewers is the number of linked viewers in the channel of the similarly linked broadcaster.
    • \n
    • \nviewer_list is an array of viewer ID strings, as requested by you when the VHS request for data is made in step 5 above.
    • \n
    • The IDs sent for broadcasters and viewers are their in-game IDs. 
    • \n
    • \nid is a random string generated for request differentiation (to avoid processing the same information twice) .
    • \n
    • \nretries is the number of times Twitch has re-tried the POST if there was an error in earlier attempts. Note that if retries is zero, it is omitted from the POST. That is, for the first call, the POST won’t have the retries field, while in subsequent POSTs, retries will be set to 1, 2, or 3.
    • \n
    \n\n

    Also see the reference documentation for the associated endpoints:

    \n\n\n\n

    Test Drops VHS connectivity

    \n\n

    To test whether you are receiving VHS heartbeats from Twitch:

    \n\n
      \n
    1. Create a channel. (If you have a Twitch account, you already have a channel.) To access your Twitch channel, log in to your Twitch Profile page. If you do not have an account, it’s easy to create one.
    2. \n
    3. Specify channel settings. Go to your channel dashboard (https://www.twitch.tv/<username>/dashboard). Select Live > Stream Information. Set the Title, Language, and Game, adding information for the game for which you are testing Drops VHS.
    4. \n
    5. Link your channel, by going through the same OAuth flow that your viewers will go through.
    6. \n
    7. Start streaming to your channel. After 5-10 minutes, you should start receiving heartbeats on your VHS endpoint.
    8. \n
    \n\n

    Managing Drops campaigns

    \n\n

    During a campaign, unlinked viewers watching a linked broadcaster of your game will receive a notification that they are eligible for Drops. Clicking the notification will navigate them to your connection page.

    \n\n

    The major steps in using drops campaigns are creating the campaigns themselves, followed by the rewards you will distribute during the campaign.

    \n\n

    Creating and editing Drops campaigns

    \n\n

    A Drops Campaign specifies the period of time that you will distribute a set of in-game rewards to Twitch viewers who watch a stream for longer than 5 minutes. 

    \n\n

    To setup a drops campaign:

    \n\n
      \n
    1. Go to your developer console: log into the developer site (https://dev.twitch.tv) and click Your Console, or go to https://dev.twitch.tv/console.
    2. \n
    3. Click Drops > + Create a Drops Campaign.
    4. \n
    5. Enter the requested fields:\n
        \n
      • \nCampaign Image: This image will be shown to streamers to summarize the campaign, and will also be used as the default image when multiple rewards are present without images associated to them.
      • \n
      • \nCampaign Name: This name will be present to streamers and viewers.
      • \n
      • \nStart Date Time and End Date Time (in UTC) for your campaign.
      • \n
      • \nGames to which the campaign will apply. You are only allowed to specify games that are claimed by your organization.
      • \n
      • \nDrops Connection URL, where unlinked viewers will be sent to create an identity connection with your game’s identity system.
      • \n
      \n
    6. \n
    7. When all fields have been entered, the Submit button is enabled. Click it to Click it to create the campaign with the selected items, or click Cancel.
    8. \n
    \n\n

    After you save your new campaign, you will be able to:

    \n\n
      \n
    • Manage the rewards you distribute to viewers during the campaign
    • \n
    • Allowlist channels that would have access to distribute drops during this campaign.
    • \n
    \n\n

    Once your campaign is live, there are several visual indicators of Drops visible on Twitch:

    \n\n
      \n
    • The browse directory (categories) page indicates whether Drops are available to all channels streaming the game. (If your Drops campaign is available only to white-listed channels, no indicator is displayed. )
    • \n
    • The game directory (category) page indicates whether Drops are available to all channels broadcasting the game. (If your Drops campaign is available only to white-listed channels, no indicator is displayed).
    • \n
    •  If a channel is Drops-enabled, the channel page tells viewers whether:\n
        \n
      • They are eligible (all set up) to receive Drops.
      • \n
      • They must create a Twitch account or link their Twitch and game accounts, to be eligible for Drops.
      • \n
      • The broadcaster has opted out of Drops.
      • \n
      \n
    • \n
    \n\n

    Create and edit Rewards using the Rewards Manager

    \n\n

    Drops Rewards (formerly, items) are the in-game content or keys you will entitle users to who watch any streams with Drops enabled. Each reward has a unique Reward ID that you can reference when entitling Twitch users who have linked their identity to your game’s identity system. To create rewards, you can do so after you’ve created a campaign directly within the Rewards tab, or via the Reward Manager using the steps below.

    \n\n
      \n
    1. Login to your organization’s console on dev.twitch.tv/console.
    2. \n
    3. Click Drops > Reward Manager > + Add New Reward.
    4. \n
    5. Enter the requested fields:\n
        \n
      • An Item Image (120x120 pixels) representing the Drop. Note that to support retina displays, images are converted down to 80x80, which is loaded into the page in a 40x40 slot.
      • \n
      • One or more Localized Item Names.
      • \n
      • \nDefault Locale for Item Name, used if no value is provided in the viewer’s locale.
      • \n
      \n
    6. \n
    7. When all fields have been entered, the Save Reward button is enabled. Click it to create the item, or click Cancel.
    8. \n
    \n\n

    Manage access to your Campaigns

    \n\n

    Within a Drops Campaign, you can allowlist channels to be eligible to distribute your rewards. As an example use case, you can run a Drops announcement campaign and allow only influencers you’ve selected to reward Drops. To allowlist channels for access to the campaign:

    \n\n
      \n
    1. Navigate to a Drop Campaign you have already created, and select the Access tab.
    2. \n
    3. Use the search bar to select Twitch streamers you wish to allowlist access to the campaign. You can also type in Twitch User IDs (TUIDs). 
    4. \n
    5. \nSave Changes when you have added these users. 
    6. \n
    \n\n\n \n \n \n \n \n
    \nImportant: When a campaign is enabled and the start time has occurred, the campaign is locked to users within this allowlist. If you wish to make changes, you must modify the allowlist or disable the campaign. 
    \n\n

    Best practices

    \n\n

    The goal of a Drops campaign is to re-engage your audience and attract new players and viewers. Based on our experience with Drops, we offer these recommendations on running a successful Drops campaign:

    \n\n
      \n
    1. A strong marketing effort for your Drops event goes a long way. Use your usual outreach channels (like blog posts and forums) to inform players about upcoming events. Leverage social media.
    2. \n
    3. In your outreach, provide clear instructions for how players can link their Twitch and game accounts. Although Twitch notifies viewers about linking their accounts, having an FAQ and crystal clear list of steps makes it easier for your users.
    4. \n
    5. Keep campaigns short and sweet. Rather than having one long campaign, use multiple short campaigns.
    6. \n
    7. Offering a different set of Drops with each campaign is a big draw.
    8. \n
    9. Offer Drops rewards that are unique to Twitch. This will draw more people to your campaign.
    10. \n
    11. Give out different rewards for different periods of viewing. Start with something for watching 30-60 mins (or less). By offering a form of short-term gratification, you’ll get people hooked. Then offer even better rewards for viewers who watch longer; e.g., different (better) items for 2 hours of watching, 6 hours, and so on.
    12. \n
    13. In your outreach, clearly communicate what viewers can earn at each milestone. In addition to your marketing communications, you can inform viewers about the items that can be earned by posting chat messages. 
    14. \n
    15. Avoid stackable/transferable Drops rewards on global (across the entire game category) campaigns, as this encourages “farming” behavior. Avoid encouraging viewers to create multiple accounts and watch different channels from multiple browser windows. Another way to avoid farming is to provide Drops only on your official channel, using allowlist capability; thus enabling you to control the duration of a campaign on a daily basis.
    16. \n
    \n\n

    Notify the viewers about earned Rewards

    \n\n

    After you determine that the Twitch user has reached the viewing or broadcasting milestone, you provide the dropped item that is the user’s reward using your own entitlement system.

    \n\n
      \n
    1. \nCreate an application access token. This token is required for us to verify your request to generate a URL. If you try to use a user OAuth token for this request, it will fail.
    2. \n
    3. Determine the list of users and entitle their accounts.
    4. \n
    5. \n

      Request a URL by calling the Create Entitlement Grants Upload URL endpoint. When you call this endpoint, you must pass in a manifest_id (maximum length: 64 characters). We recommend using a GUID. Once you have the manifest_id and application access token, you’ll make a call with the manifest_id in a query string and the application access token in the Authorization header:

      \n\n
      \n
      curl -H 'Client-ID: <your client id>' \\\n-H 'Authorization: Bearer <app access token>' \\\n-X POST 'https://api.twitch.tv/helix/entitlements/upload?manifest_id=<manifestID>&type=bulk_drops_grant'\n
      \n\n

      You will get back a JSON object containing a URL like this:

      \n\n
      \n
      https://twitch-ds-vhs-drops-granted-uploads-us-west-2-prod.s3-us-west-2.amazonaws.com/<clientID>/<time>-<guid>-<manifestID>.json?X-Amz-Algorithm=AWS4-HMAC-SHA256\\u0026X-Amz-Credential=<credential>%2Fus-west-2%2Fs3%2Faws4_request\\u0026X-Amz-Date=<date>\\u0026X-Amz-Expires=900\\u0026X-Amz-Security-Token=<token>\\u0026X-Amz-SignedHeaders=host\\u0026X-Amz-Signature=<signature>\n
      \n
    6. \n
    7. \n

      Edit the URL: replace \\u0026 with & (ampersand). After the replacement, the URL above looks like this:

      \n\n
      \n
      https://twitch-ds-vhs-drops-granted-uploads-us-west-2-prod.s3-us-west-2.amazonaws.com/<clientID>/<time>-<guid>-<manifestID>.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credential>%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=<date>&X-Amz-Expires=900&X-Amz-Security-Token=<token>&X-Amz-SignedHeaders=host&X-Amz-Signature=<signature>\n
      \n
    8. \n
    9. \n

      Create a JSON file (up to 100 MB) with the list of users to notify. The general structure of the JSON file is:

      \n\n
      \n
      {\n   \"campaign_id\": \"\",\n   \"client_id\": \"\",\n   \"game_watched\": \"\",\n   \"broadcaster_id\": \"\",\n   \"item_id\": \"\",\n   \"reason\": \"\",\n   \"users\": [\"1004321\", \"1004320\", \"1004319\"]\n}\n
      \n\n

      For descriptions of the fields, see the Manifest file fields section.

      Note that one large JSON file gets processed much faster than multiple small files.

      \n
    10. \n
    11. Send the JSON file to Twitch. We process it and notify users on the Twitch website. The notification will take the user to the Inventory page to see the Rewards they’ve been granted. If the viewer clicks the notification, your item name and image appear.
      To send the file, PUT it to the URL generated in the previous steps. This starts the processing and delivery of notifications to end users. For example:
    12. \n
    \n\n
     curl \\\n --data-binary @manifest-file.json \\\n -X PUT 'https://twitch-ds-vhs-drops-granted-uploads-us-west-2-prod.s3-us-west-2.amazonaws.com/<clientID>/<time>-<guid>-<manifestID>.json?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credential>%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=<date>&X-Amz-Expires=900&X-Amz-Security-Token=<token>&X-Amz-SignedHeaders=host&X-Amz-Signature=<signature>'\n
    \n\n

    If the upload is successful, you will get HTTP 200 OK back in response.

    \n\n

    Manifest file fields

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    campaign_idstringUnique ID of the Drops Campaign. You can find this in the top right corner when selecting an existing Campaign 
    client_idstringClient ID of the application for the Drops campaign.
    game_watchedstringName of the game being watched for the Drops campaign. This must exactly match the name in the reported VHS data, including case.
    broadcaster_idstringUnique game account ID of the broadcaster that was streaming the game. 
    item_idstring\n

    (Optional) Unique ID of the Drops reward. This determines the image and name the viewer sees in the notification. Twitch assigns this when a Drops reward is created. You can see the reward’s ID on your Twitch developer console. Click Drops, then either:

    \n
      \n
    • For a list of all items, click the Reward Manager button.
    • \n
    • For a list of rewards in a specific campaign, select the Drops Campaign tab, then click the Rewards tab.
    • \n
    \nNote: We recommend you use this field. While it’s optional now, it’s expected to become required in the future.
    reasonenumerationWhy the reward is being awarded. This determines a portion of the notification the user sees. Valid value: watching.
    usersstring []Array of game account IDs of viewers who have been entitled the reward and will get a notification. 
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","embed":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Embedded Experiences Requirements
    \n\t\t\n\t\t\t
    Providing Feedback
    \n\t\t\n\t\n\n\n\t\t

    Embedding Twitch in Your Website

    \n\n

    Introduction

    \n\n

    You can embed Twitch functionality in your website in three ways:

    \n\n
      \n
    • \nEmbedding Everything explains how to embed both Chat and Player for live content in one iframe. This includes the functionality for follows, subscribe, and login. Also supports playing Video on Demand content.
    • \n
    • \nEmbedding Chat explains additional options for embedding only Chat.
    • \n
    • \nEmbedding Video and Clips explains additional options for embedding only Player, including Clips content.
    • \n
    \n\n

    Embedded Experiences Requirements

    \n\n

    Your use of any Twitch embeddable experience must comply with the requirements below and the Twitch Developer Services Agreement. Twitch may revoke embed usage for domains that are not in compliance. Twitch reserves the right to revoke your ability to use our embeddable experiences, for any reason, at any time.

    \n\n

    1.1 Domains that use Twitch embeds must use SSL certificates.

    \n\n

    1.2 Twitch requires our embed users to verify where they use our products on the web using a special parameter: parent. Depending on your integration method, you may provide this as a query parameter in an iframe src attribute, or as a property on the JavaScript object you use to construct a new Twitch embed. For more information, see the embed API documentation above and our initial announcement of the requirement. Embed domains that don’t specify this parameter will trigger a playback error message that will direct end users to click through to Twitch if they wish to watch that content.

    \n\n

    1.3 Embeds must utilize only Twitch-approved player elements and should not be obscured in any way by other page elements in whatever domain context they may appear.

    \n\n

    1.4 Embeds must adhere to the recommended minimum height and width requirements outlined in their respective attribute tables.

    \n\n

    Providing Feedback

    \n\n

    We’re constantly trying to improve the developer experience, so if you encounter any difficulty using Twitch embed, please provide feedback via Embed Feedback.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","chat":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Usage
    \n\t\t\n\t\t\t
    Parameters
    \n\t\t\n\t\t\t
    Example
    \n\t\t\n\t\n\n\n\t\t

    Embedding Chat

    \n\n

    Usage

    \n\n

    To embed a Twitch chat window in your website, use this expression:

    \n\n
    <iframe src=\"https://www.twitch.tv/embed/<channel>/chat?parent=<parent>\"\n        height=\"<height>\"\n        width=\"<width>\">\n</iframe>\n
    \n\n

    Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    heightnumber or stringHeight of the chat window, in pixels. Can also be expressed as a percentage, by passing a string like 50%\n
    parentstring\n(Required) Domain(s) that will be embedding Twitch. You must have one parent key for each domain your site is hosted or embedded on.
    sandboxstring\nNote: the sandbox attribute is not required, but if you specify it, you must include the following keywords to ensure all Twitch features function as expected: allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox allow-modals\n
    srcstringChat window URL.
    widthnumber or stringWidth of the chat window, in pixels. Can be expressed as a percentage, by passing a string like 50%\n
    \n\n

    Example

    \n\n
    <iframe id=\"chat_embed\"\n        src=\"https://www.twitch.tv/embed/hebo/chat?parent=streamernews.example.com\"\n        height=\"500\"\n        width=\"350\">\n</iframe>\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","everything":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Logging In
    \n\t\t\n\t\t\t
    Authentication
    \n\t\t\n\t\t\t
    Overlays
    \n\t\t\n\t\t\t
    Usage
    \n\t\t\n\t\t\t
    Programmatic Access
    \n\t\t\n\t\n\n\n\t\t

    Embedding Everything

    \n\n

    Introduction

    \n\n

    This guide explains how to embed Live Video with Chat or Video on Demand in a non-Twitch website.

    \n\n

    Logging In

    \n\n

    Logging in is a seamless, lightweight experience for users of the Twitch Embed Player on non-Twitch websites. Once logged in, a user can chat, follow a channel, or subscribe to a channel. When users try to perform one of these actions, they are prompted to create a Twitch account or sign in to an existing one.

    \n\n

    Authentication

    \n\n

    Users of embedded Twitch are authenticated in the same way as users of the Twitch website - that is, with the same authentication flow.

    \n\n

    Overlays

    \n\n

    The Twitch embed contains buttons for Sign In, Follow, and Subscribe, in an overlay above the player.

    \n\n

    In some cases, clicking a button opens a pop-up window that allows the user to complete the desired action (for example, navigate through the payment flow or create an account). In others, it automatically goes through with the action (such as Following).

    \n\n

    The name of the channel being watched is an overlay that appears when you hover your mouse over the player. On embeds, these titles do not link back to Twitch.

    \n\n

    Usage

    \n\n
      \n
    1. Add a placeholder element with a unique ID to your page, where you want the Twitch embed to render.
    2. \n
    3. Load the Twitch embed JavaScript file.
    4. \n
    5. Initialize a Twitch.Embed object, with the placeholder element ID and options. If your site will be embedded on other domains, you must include them as a JavaScript array of strings under the key parent.\n
    6. \n
    \n\n
    <html>\n  <body>\n    <!-- Add a placeholder for the Twitch embed -->\n    <div id=\"twitch-embed\"></div>\n\n    <!-- Load the Twitch embed script -->\n    <script src=\"https://embed.twitch.tv/embed/v1.js\"></script>\n\n    <!-- Create a Twitch.Embed object that will render within the \"twitch-embed\" root element. -->\n    <script type=\"text/javascript\">\n      new Twitch.Embed(\"twitch-embed\", {\n        width: 854,\n        height: 480,\n        channel: \"monstercat\",\n        // only needed if your site is also embedded on embed.example.com and othersite.example.com \n        parent: [\"embed.example.com\", \"othersite.example.com\"]\n      });\n    </script>\n  </body>\n</html>\n
    \n\n

    Embed Parameters

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    OptionTypeDescription
    allowfullscreenbooleanIf true, the player can go full screen. Default: true.
    autoplaybooleanIf true, the video starts playing automatically, without the user clicking play. The exception is mobile devices, on which video cannot be played without user interaction. Default: true.
    channelstringName of the chat room and channel (live content only).
    collectionstringThe VOD collection to play. If you use this, you may also specify an initial video in the VOD collection, otherwise playback will begin with the first video in the collection. All VODs are auto-played. Chat replay is not supported. Example parameters object:
    { video: \"124085610\", collection: \"GMEgKwTQpRQwyA\" }\n
    heightnumber or stringHeight of the rendered element, in pixels. This can be expressed as a percentage, by passing a string like 50%. Minimum: 400. Default: 480.
    layoutstringDetermines the screen layout. Valid values:
      \n
    • \nvideo-with-chat: Default if channel is provided, and only supported for live content. Shows both video and chat side-by-side. At narrow sizes, chat renders under the video player.
    • \n
    • \nvideo: Default if channel is not provided. Shows only the video player (omits chat).
    • \n
    \n
    mutedbooleanSpecifies whether the initial state of the video is muted. Default: false.
    parentstring[]\nRequired if your site is embedded on any domain(s) other than the one that instantiates the Twitch embed. Example parent parameter: [\"streamernews.example.com\", \"embed.example.com\"].
    themestringThe Twitch embed color theme to use. Valid values: light or dark. Default: dark.
    timestringTime in the video where playback starts. Specifies hours, minutes, and seconds. Default: 0h0m0s (the start of the video).
    videostringID of a VOD to play. Chat replay is not supported.
    widthnumber or stringMaximum width of the rendered element, in pixels. This can be expressed as a percentage, by passing a string like 100%. Minimum: 340. Default: 940.
    \n\n

    Working with Events

    \n\n

    To listen to events, create a Twitch.Embed object, then call the addEventListener method on that object:

    \n\n
    var embed = new Twitch.Embed('twitch-embed', {\n  channel: 'monstercat'\n});\n\nembed.addEventListener(Twitch.Embed.VIDEO_READY, function() {\n  console.log('The video is ready');\n});\n
    \n\n

    Available Events

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    EventDescription
    Twitch.Embed.VIDEO_PLAYThe video started playing. This callback receives an object with a sessionId property.
    Twitch.Embed.VIDEO_READYThe video player is ready for API commands.
    \n\n

    Programmatic Access

    \n\n

    Advanced usage: To provide additional functionality to our API, access specific components with getPlayer(), which retrieves the current video player instance from the Embed, and provides full programmatic access to the video player API.

    \n\n
    <html>\n  <body>\n    <!-- Add a placeholder for the Twitch embed -->\n    <div id=\"twitch-embed\"></div>\n\n    <!-- Load the Twitch embed script -->\n    <script src=\"https://embed.twitch.tv/embed/v1.js\"></script>\n\n    <!--\n      Create a Twitch.Embed object that will render\n      within the \"twitch-embed\" root element.\n    -->\n    <script type=\"text/javascript\">\n      var embed = new Twitch.Embed(\"twitch-embed\", {\n        width: 854,\n        height: 480,\n        channel: \"monstercat\",\n        layout: \"video\",\n        autoplay: false,\n        // only needed if your site is also embedded on embed.example.com and othersite.example.com \n        parent: [\"embed.example.com\", \"othersite.example.com\"]\n      });\n\n      embed.addEventListener(Twitch.Embed.VIDEO_READY, () => {\n        var player = embed.getPlayer();\n        player.play();\n      });\n    </script>\n  </body>\n</html>\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","video-and-clips":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Non-Interactive Inline Frames for Live Streams and VODs
    \n\t\t\n\t\t\t
    Interactive Frames for Live Streams and VODs
    \n\t\t\n\t\t\t
    Non-Interactive IFrames for Clips
    \n\t\t\n\t\n\n\n\t\t

    Embedding Video and Clips

    \n\n

    Introduction

    \n\n

    You can embed live streams, video on demand (VOD), and clips in your website. Embedded video windows must be at least 400x300 pixels.

    \n\n

    There are three types of VODs:

    \n\n
      \n
    • \nPast broadcasts are created automatically from a live stream.
    • \n
    • \nHighlights can be created by broadcasters from past broadcasts.
    • \n
    • \nUploads are external videos that are added to Twitch using the Video Uploads API or the Video Manager.
    • \n
    \n\n

    This guide discusses three techniques for embedding video and clips

    \n\n\n\n

    For more information, see VOD, Clips, and Clips Discovery.

    \n\n

    Non-Interactive Inline Frames for Live Streams and VODs

    \n\n
    <iframe\n    src=\"https://player.twitch.tv/?<channel, video, or collection>&parent=streamernews.example.com\"\n    height=\"<height>\"\n    width=\"<width>\"\n    allowfullscreen=\"<allowfullscreen>\">\n</iframe>\n
    \n\n

    Iframe Attributes

    \n\n

    These attributes are defined in the IFrame element. The Twitch player can not set or modify them.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    allowfullscreenbooleanIf true, the player can go full screen.
    heightnumber or stringHeight of the embedded window, in pixels. This can be expressed as a percentage, by passing a string like 100%. Recommended minimum: 300
    parentstring\n(required) Domain(s) that will be embedding Twitch. You must have one parent key for each domain your site uses.
    srcstringThe iframe src URL string should be https://player.twitch.tv/ with one of these required query string parameters:
      \n
    • \nchannel – (string) Name of the channel, for a live stream.
    • \n
    • \nvideo – (string) Video ID (for past broadcasts, highlights, and video uploads). In this context (the video player), the video ID must have a “v” prefix.
    • \n
    • \ncollection - (string) Collection ID, for a collection of videos.
    • \n
    If both video and collection are specified, the specified collection starts playing from the specified video. If the video is not in the collection, collection is ignored and the specified video is played.

    If channel is specified along with video and/or collection, only channel is used.
    widthnumber or stringWidth of the embedded window, in pixels. This can be expressed as a percentage, by passing a string like 50%. Recommended minimum: 400
    \n\n

    Optional Query String Parameters on Iframe src\n

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    autoplaybooleanIf true, the video starts playing automatically, without the user clicking play. The exception is mobile devices, on which video cannot be played without user interaction. Default: true.
    mutedbooleanSpecifies whether the initial state of the video is muted. Default: false.
    time1h2m3sTime in the video where playback starts. Specifies hours, minutes, and seconds. Default: 0h0m0s (the start of the video).
    \n\n

    Video Metadata

    \n\n

    Information on video channels, lengths, descriptions, and viewcounts is available through the Videos endpoints.

    \n\n

    Examples

    \n\n

    Using a channel name:

    \n\n
    <iframe\n    src=\"https://player.twitch.tv/?channel=dallas&parent=streamernews.example.com&muted=true\"\n    height=\"720\"\n    width=\"1280\"\n    allowfullscreen=\"true\">\n</iframe>\n
    \n\n

    Using a video ID:

    \n\n
    <iframe\n    src=\"https://player.twitch.tv/?video=v40464143&parent=streamernews.example.com&autoplay=false\"\n    height=\"720\"\n    width=\"1280\"\n    allowfullscreen=\"true\">\n</iframe>\n
    \n\n

    Using a collection ID:

    \n\n
    <iframe\n    src=\"https://player.twitch.tv/?collection=abcDeF1ghIJ2kL&parent=streamernews.example.com\"\n    height=\"720\"\n    width=\"1280\"\n    allowfullscreen=\"true\">\n</iframe>\n
    \n\n

    Interactive Frames for Live Streams and VODs

    \n\n
    <script src= \"https://player.twitch.tv/js/embed/v1.js\"></script>\n<div id=\"<player div ID>\"></div>\n<script type=\"text/javascript\">\n  var options = {\n    width: <width>,\n    height: <height>,\n    channel: \"<channel ID>\",\n    video: \"<video ID>\",\n    collection: \"<collection ID>\",\n    // only needed if your site is also embedded on embed.example.com and othersite.example.com\n    parent: [\"embed.example.com\", \"othersite.example.com\"]\n  };\n  var player = new Twitch.Player(\"<player div ID>\", options);\n  player.setVolume(0.5);\n</script>\n
    \n\n

    Required Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    \nchannel
    – OR –
    video
    – OR –
    collection\n
    stringChannel name (for a live stream), video ID, or collection ID. (To change the channel or video later, use setChannel, setVideo, or setCollection; see Synchronous Playback Controls.)

    If both video and collection are specified, the specified collection starts playing from the specified video. If the video is not in the collection, collection is ignored and the specified video is played.

    If channel is specified along with video and/or collection, only channel is used.
    heightnumber or stringHeight of the embedded window, in pixels. Can be expressed as a percentage, by passing a string like 100%. Recommended minimum: 300.
    parentstring[]\nOnly required if your site is embedded on any domain(s) other than the one that instantiates the Twitch embed. Example parent parameter: [\"streamernews.example.com\", \"embed.example.com\"]\n
    player div IDstringAny value you like, as long as it is the same in both locations within the example.
    widthnumber or stringWidth of the embedded window, in pixels. Can be expressed as a percentage, by passing a string like 50%. Recommended minimum: 400.
    \n\n

    Optional Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    autoplaybooleanIf true, the video starts playing automatically, without the user clicking play. The exception is mobile devices, on which video cannot be played without user interaction. Default: true.
    mutedbooleanSpecifies whether the initial state of the video is muted. Default: false.
    timestringOnly valid for Video on Demand content. Time in the video where playback starts. Specifies hours, minutes, and seconds. Default: 0h0m0s (the start of the video).
    \n\n

    Synchronous JavaScript Playback API

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CallDescription
    disableCaptions():voidDisables display of Closed Captions.
    enableCaptions():voidEnables display of Closed Captions. Note captions will only display if they are included in the video content being played. See the CAPTIONS JavaScript Event for more info.
    pause():voidPauses the player.
    play():voidBegins playing the specified video.
    seek(timestamp:Float):voidSeeks to the specified timestamp (in seconds) in the video and resumes playing if paused. Does not work for live streams.
    setChannel(channel:String):voidSets the channel to be played.
    setCollection(collection ID:String, video ID:String):voidSets the collection to be played.

    Optionally also specifies the video within the collection, from which to start playback. If a video ID is not provided here or the specified video is not part of the collection, playback starts with the first video in the collection.
    setQuality(quality:String):voidSets the quality of the video. quality should be a string value returned by getQualities.
    setVideo(video ID:String, timestamp:Number):voidSets the video to be played to be played and starts playback at timestamp (in seconds).
    \n\n

    Synchronous JavaScript Volume API

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CallDescription
    getMuted():BooleanReturns true if the player is muted; otherwise, false.
    setMuted(muted:Boolean):voidIf true, mutes the player; otherwise, unmutes it. This is independent of the volume setting.
    getVolume():FloatReturns the volume level, a value between 0.0 and 1.0.
    setVolume(volumelevel:Float):voidSets the volume to the specified volume level, a value between 0.0 and 1.0.
    \n\n

    Synchronous JavaScript Status API

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CallDescription
    getPlaybackStats():PlaybackStatsReturns an object with statistics on the embedded video player and the current live stream or VOD. See below for more info.
    getChannel():StringReturns the channel’s name. Works only for live streams, not VODs.
    getCurrentTime():FloatReturns the current video’s timestamp, in seconds. Works only for VODs, not live streams.
    getDuration():FloatReturns the duration of the video, in seconds. Works only for VODs,not live streams.
    getEnded():BooleanReturns true if the live stream or VOD has ended; otherwise, false.
    getQualities():String[]Returns the available video qualities. For example, chunked (pass-through of the original source).
    getQuality():StringReturns the current quality of video playback.
    getVideo():StringReturns the video ID. Works only for VODs, not live streams.
    isPaused():BooleanReturns true if the video is paused; otherwise, false. Buffering or seeking is considered playing.
    \n\n

    PlaybackStats Object attributes

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    backendVersionstringThe version of the Twitch video player backend.
    bufferSizenumberThe size of the video buffer in seconds.
    codecsstringCodecs currently in use, comma-separated (video,audio).
    displayResolutionstringThe current size of the video player element (eg. 850x480).
    fpsnumberThe video playback rate in frames per second. Not available on all browsers.
    hlsLatencyBroadcasternumberCurrent latency to the broadcaster in seconds. Only available for live content.
    playbackRatenumberThe playback bitrate in Kbps.
    skippedFramesnumberThe number of dropped frames.
    videoResolutionstringThe native resolution of the current video (eg. 640x480).
    \n\n

    JavaScript Events 

    \n\n

    To listen to events, call addEventListener(event:String, callback:Function).

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    EventEmitted when …
    Twitch.Player.CAPTIONSClosed captions are found in the video content being played. This event will be emitted once for each new batch of captions, in sync with the corresponding video content. The event payload is a string containing the caption content.
    Twitch.Player.ENDEDVideo or stream ends.
    Twitch.Player.PAUSEPlayer is paused. Buffering and seeking is not considered paused.
    Twitch.Player.PLAYPlayer just unpaused, will either start video playback or start buffering.
    Twitch.Player.PLAYBACK_BLOCKEDPlayer playback was blocked. Usually fired after an unmuted autoplay or unmuted programmatic call on play().
    Twitch.Player.PLAYINGPlayer started video playback.
    Twitch.Player.OFFLINELoaded channel goes offline.
    Twitch.Player.ONLINELoaded channel goes online.
    Twitch.Player.READYPlayer is ready to accept function calls.
    \n\n

    Example

    \n\n
    <script src= \"https://player.twitch.tv/js/embed/v1.js\"></script>\n<div id=\"SamplePlayerDivID\"></div>\n<script type=\"text/javascript\">\n  var options = {\n    width: 854,\n    height: 480,\n    channel: \"dallas\",\n    // only needed if your site is also embedded on embed.example.com and othersite.example.com\n    parent: [\"embed.example.com\", \"othersite.example.com\"]\n  };\n  var player = new Twitch.Player(\"SamplePlayerDivID\", options);\n  player.setVolume(0.5);\n</script>\n
    \n\n

    Non-Interactive IFrames for Clips

    \n\n

    Embedding a clip is different than embedding a live stream or VOD. The embedded clips player uses a different set of query parameters and does not support the JavaScript interactive embed.

    \n\n

    IFrame Prototype

    \n\n
    <iframe\n    src=\"https://clips.twitch.tv/embed?clip=<slug>&parent=streamernews.example.com\"\n    height=\"<height>\"\n    width=\"<width>\"\n    allowfullscreen=\"<allow full screen>\">\n</iframe>\n
    \n\n

    Iframe Attributes

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    NameTypeDescription
    allowfullscreenbooleanIf true, the player can go full screen.
    clipstringA globally unique string called a slug, by which clips are referenced.
    heightnumber or stringHeight of the embedded window, in pixels. This can be expressed as a percentage, by passing a string like 50%. Recommended minimum: 300.
    parentstring\n(required) Domain(s) that will be embedding Twitch. You must have one parent key for each domain your site uses.
    preloadenumA hint to the browser about what the developer thinks will lead to the best user experience. Valid values:
      \n
    • \nnone - The video should not be preloaded.
    • \n
    • \nmetadata - Only video metadata (e.g., length) is fetched. This is the recommended value.
    • \n
    • \nauto - The whole video file could be downloaded, even if the user is not expected to use it.
    • \n
    • \n\"\" (empty string) - Same as auto.
    • \n
    Default: browser-defined.

    The HTML specification does not force the browser to follow the value of this attribute; it is merely a hint.
    widthnumber or stringWidth of the embedded window, in pixels. This can be expressed as a percentage, by passing a string like 50%. Recommended minimum: 400.
    \n\n

    Optional IFrame Query Parameters

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    autoplaybooleanIf true, the video starts playing automatically, without the user clicking play. The exception is mobile devices, on which video cannot be played without user interaction. Default: false.
    mutedbooleanSpecifies whether the initial state of the video is muted. Default: false.
    \n\n

    Example

    \n\n
    <iframe\n   src=\"https://clips.twitch.tv/embed?clip=IncredulousAbstemiousFennelImGlitch&parent=streamernews.example.com&parent=embed.example.com\"\n   height=\"360\"\n   width=\"640\"\n   allowfullscreen=\"true\">\n</iframe>\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","eventsub":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Subscriptions
    \n\t\t\n\t\n\n\n\t\t

    EventSub

    \n\n

    Introduction

    \n\n

    Long-term our plan is to provide a single product, EventSub, that allows developers to subscribe to events and receive notifications over many different transports: webhooks, websockets, etc..

    \n\n

    All events and payloads have been designed to be transport agnostic. Choosing webhooks over websockets (or vice-versa) won’t change the events available to you or how those events behave. If a new event type is added to EventSub, it is added to all transports simultaneously.

    \n\n

    Subscriptions

    \n\n

    Subscriptions enable your application to listen for events that happen on Twitch. When an event occurs for one of your subscriptions, Twitch sends you a notification. For example, you might choose to receive a notification when:

    \n\n
      \n
    • A stream has gone online.
    • \n
    • A broadcaster has a new follower.
    • \n
    • A broadcaster has a new subscriber.
    • \n
    • A user has cheered in a channel.
    • \n
    • A user has redeemed channel points.
    • \n
    \n\n

    For a complete list of the available subscription types and their requirements, see EventSub Subscription Types.

    \n\n

    Authorization

    \n\n

    You must include an app access token in all API requests. You do not need to include a user access token, even for subscriptions that require user authorization. This is because Twitch checks authorization throughout the lifetime of your subscription by calling Twitch’s internal authorization systems directly.

    \n\n

    Secret

    \n\n

    When creating a subscription, you must specify a secret for purposes of verification, described below in “Verify a signature”.

    \n\n

    The secret is a string between 10 and 100 characters that your application will define and send to Twitch in the subscription creation process. As a result, this secret should not be your Client Secret or Extension secret.

    \n\n

    Create a subscription

    \n\n

    To create a subscription:

    \n\n
      \n
    1. \n

      Call the POST https://api.twitch.tv/helix/eventsub/subscriptions endpoint with the subscription details in the request body. The URL provided in the callback field MUST use HTTPS and port 443. For local development consider using a product like ngrok to easily create an HTTPS endpoint.

      \n\n
      \n
      POST https://api.twitch.tv/helix/eventsub/subscriptions\n----\nClient-ID:     crq72vsaoijkc83xx42hz6i37\nAuthorization: Bearer C0BIYxs4JvnBWqvAmBvjfFc\nContent-Type: application/json\n----\n{\n    \"type\": \"channel.follow\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"12826\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
      \n
    2. \n
    3. \n

      Twitch responds indicating the subscription request’s status is webhook_callback_verification_pending. This is because Twitch needs to verify that you own the callback you specified.

      \n\n
      \n
      {\n    \"data\": [{\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"status\": \"webhook_callback_verification_pending\",\n        \"type\": \"channel.follow\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"12826\"\n        },\n        \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    }],\n    \"total\": 1,\n    \"limit\": 10000\n}\n
      \n
    4. \n
    5. \n

      Twitch sends a callback verification request to your server using the callback URL provided in your request.

      \n\n
      \n
      POST https://example.com/webhooks/callback\n----\nTwitch-Eventsub-Message-Id:             e76c6bd4-55c9-4987-8304-da1588d8988b\nTwitch-Eventsub-Message-Retry:          0\nTwitch-Eventsub-Message-Type:           webhook_callback_verification\nTwitch-Eventsub-Message-Signature:      sha256=f56bf6ce06a1adf46fa27831d7d15d\nTwitch-Eventsub-Message-Timestamp:      2019-11-16T10:11:12.123Z\nTwitch-Eventsub-Subscription-Type:      channel.follow\nTwitch-Eventsub-Subscription-Version:   1\n----\n{\n    \"challenge\": \"pogchamp-kappa-360noscope-vohiyo\",\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"status\": \"webhook_callback_verification_pending\",\n        \"type\": \"channel.follow\",\n        \"version\": \"1\",\n        \"condition\": {\n                \"broadcaster_user_id\": \"12826\"\n        },\n        \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    }\n}\n
      \n
    6. \n
    7.  Verify the request signature  to make sure it came from Twitch.
    8. \n
    9. \n

      Return the value of challenge from the callback verification request to complete the verification process. Your response must be a raw string. If your server is using a web framework, be careful that your web framework isn’t modifying the response in an incompatible way. For example, some web frameworks default to converting responses into JSON objects.
      pogchamp-kappa-360noscope-vohiyo

      \n
    10. \n
    11. Your subscription is now active!
    12. \n
    \n\n

    Receive a notification

    \n\n

    When an event triggers your subscription, Twitch will send a notification to your callback.

    \n\n

    To test receiving a notification:

    \n\n
      \n
    1.  Create a subscription  for when channel 12826 receives a new follower.
    2. \n
    3. Go to Twitch and follow that channel.
    4. \n
    5. \n

      You’ll receive a notification request to your subscription’s callback:

      \n\n
      \n
      POST https://example.com/webhooks/callback\n----\nTwitch-Eventsub-Message-Id:             befa7b53-d79d-478f-86b9-120f112b044e\nTwitch-Eventsub-Message-Retry:          0\nTwitch-Eventsub-Message-Type:           notification\nTwitch-Eventsub-Message-Signature:      sha256=d66824350041dce130e3478f5a7\nTwitch-Eventsub-Message-Timestamp:      2019-11-16T10:11:12.123Z\nTwitch-Eventsub-Subscription-Type:      channel.follow\nTwitch-Eventsub-Subscription-Version:   1\n----\n{\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"status\": \"enabled\",\n        \"type\": \"channel.follow\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"12826\"\n        },\n        \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"user_id\": \"1337\",\n        \"user_login\": \"awesome_user\",\n        \"user_name\": \"Awesome_User\",\n        \"broadcaster_user_id\":     \"12826\",\n        \"broadcaster_user_login\":  \"twitch\",\n        \"broadcaster_user_name\":   \"Twitch\"\n    }\n}\n
      \n
    6. \n
    7.  Verify the request signature  to make sure it came from Twitch.
    8. \n
    9. Acknowledge the notification by returning a 2XX status code.
    10. \n
    \n\n

    It is expected that you’ll respond to the notification request within a few seconds. If your server takes too long to respond, the request will time out. If your server can’t process a notification request quickly enough, consider writing the payload to temporary storage, responding with a 2XX, then processing the notification afterwards.

    \n\n

    Twitch’s subscriptions are designed as an at-least-once system. This means that if Twitch is ever unsure whether you received a notification, it’ll retry. Under some circumstances this means you may receive a notification twice. If this is problematic for your use case, review the handling duplicates section for information on how to handle this reliably.

    \n\n

    List your subscriptions

    \n\n

    To view your current subscriptions, call the GET https://api.twitch.tv/helix/eventsub/subscriptions endpoint. This endpoint will return a paginated list of all your subscriptions, including subscriptions that are disabled. This API endpoint is a great debugging tool if you aren’t receiving notifications for a subscription you believe should exist.

    \n\n

    Request

    \n\n
    GET https://api.twitch.tv/helix/eventsub/subscriptions\n----\nClient-ID:     crq72vsaoijkc83xx42hz6i37\nAuthorization: Bearer deadbeefdeadbeef\n
    \n\n

    Response

    \n\n
    {\n    \"data\": [\n        {\n            \"id\": \"26b1c993-bfcf-44d9-b876-379dacafe75a\",\n            \"status\": \"enabled\",\n            \"type\": \"streams.online\",\n            \"version\": \"1\",\n            \"condition\": {\n                \"broadcaster_user_id\": \"1234\"\n            },\n            \"created_at\": \"2020-11-10T20:08:33Z\",\n            \"transport\": {\n                \"method\": \"webhook\",\n                \"callback\": \"https://this-is-a-callback.com\"\n            }\n        },\n        {\n            \"id\": \"35016908-41ff-33ce-7879-61b8dfc2ee16\",\n            \"status\": \"webhook_callback_verification_pending\",\n            \"type\": \"users.update\",\n            \"version\": \"1\",\n            \"condition\": {\n                \"user_id\": \"1234\"\n            },\n            \"created_at\": \"2020-11-10T20:31:52Z\",\n            \"transport\": {\n                \"method\": \"webhook\",\n                \"callback\": \"https://this-is-a-callback.com\"\n            }\n        }\n    ],\n    \"total\": 2,\n    \"limit\": 10000,\n    \"pagination\": {}\n}\n
    \n\n

    Note that the total field contains an approximate number of subscriptions. After creating or deleting a subscription, it may take a few seconds for total to update.

    \n\n

    You can also filter by subscriptions status by including the status query parameter in the request. For example, if you want only enabled subscriptions call GET https://api.twitch.tv/helix/eventsub/subscriptions?status=enabled.

    \n\n

    All possible statuses are:

    \n\n
      \n
    • \nenabled: designates that the subscription is in an operable state and is valid.
    • \n
    • \nwebhook_callback_verification_pending: webhook is pending verification of the callback specified in the subscription creation request.
    • \n
    • \nwebhook_callback_verification_failed: webhook failed verification of the callback specified in the subscription creation request.
    • \n
    • \nnotification_failures_exceeded: notification delivery failure rate was too high.
    • \n
    • \nauthorization_revoked: authorization for user(s) in the condition was revoked.
    • \n
    • \nuser_removed: a user in the condition of the subscription was removed.
    • \n
    \n\n

    Delete a subscription

    \n\n

    To delete a subscription call the DELETE https://api.twitch.tv/helix/eventsub/subscriptions endpoint and specify the id for the subscription to delete.

    \n\n
    DELETE https://api.twitch.tv/helix/eventsub/subscriptions?id=f1c2a387-161a-49f9-a165-0f21d7a4e1c4\n----\nClient-ID:     crq72vsaoijkc83xx42hz6i37\nAuthorization: Bearer deadbeefdeadbeef\n
    \n\n

    Verify a signature

    \n\n

    Whenever you receive a request from Twitch, a signature will be included in the Twitch-Eventsub-Message-Signature header. To verify that a request is authentic you must verify its signature.

    \n\n

    The signature uses HMAC-SHA256. The HMAC key is your subscription’s secret. The HMAC message is the concatenation of the Twitch-Eventsub-Message-Id header, the Twitch-Eventsub-Message-Timestamp header, and the raw bytes of the request body.

    \n\n

    If the signature in the Twitch-Eventsub-Message-Signature doesn’t match the signature you computed, return a 4XX status code.

    \n\n

    Pseudocode

    \n\n
    hmac_message = headers['Twitch-Eventsub-Message-Id'] + headers['Twitch-Eventsub-Message-Timestamp'] + request.body\nsignature = hmac_sha256(webhook_secret, hmac_message)\nexpected_signature_header = 'sha256=' + signature.hex()\n\nif headers['Twitch-Eventsub-Message-Signature'] != expected_signature_header:\n    return 403\n
    \n\n

    Note: Request header names are case-insensitive. Some languages, like JavaScript, convert header names to lowercase regardless of how they were sent. If your language does this, use .toLowerCase() before checking headers.

    \n\n

    If your use case requires resiliency against replay attacks, do the following:

    \n\n
      \n
    • Make sure the value of the Twitch-Eventsub-Message-Timestamp header isn’t older than 10 minutes.
    • \n
    • Make sure the value of the Twitch-Eventsub-Message-Id header hasn’t been seen before.
    • \n
    \n\n

    Handling duplicates

    \n\n

    Twitch’s subscriptions are designed as an at-least-once system. This means that if Twitch is ever unsure whether you received a message, it’ll retry. Under some circumstances this means you may receive a message twice.

    \n\n

    Every message includes a Twitch-Eventsub-Message-Id header. If a message is retried, the value of the Twitch-Eventsub-Message-Id header will stay the same.

    \n\n

    If you need to deduplicate messages, keep track of the values of Twitch-Eventsub-Message-Id you’ve seen. If you receive a message that contains a Twitch-Eventsub-Message-Id you’ve already seen, immediately return a 2XX status code.

    \n\n

    Subscription revocation

    \n\n

    Twitch reserves the right to revoke a subscription at any time. The most common reasons for revocation are:

    \n\n
      \n
    • The subscription depends on events for a user id that no longer exists.
    • \n
    • The subscription depends on an authorization token that was revoked by the user.
    • \n
    • The subscription callback failed its notifications over an extended period of time.
    • \n
    \n\n

    When a subscription is revoked, you’ll receive a revocation request to that subscription’s callback:

    \n\n
    POST https://example.com/webhooks/callback\n----\nTwitch-Eventsub-Message-Id:             84c1e79a-2a4b-4c13-ba0b-4312293e9308\nTwitch-Eventsub-Message-Retry:          0\nTwitch-Eventsub-Message-Type:           revocation\nTwitch-Eventsub-Message-Signature:      sha256=c1f92c51dab9888b0d6fb5f7e8e758\nTwitch-Eventsub-Message-Timestamp:      2019-11-16T10:11:12.123Z\nTwitch-Eventsub-Subscription-Type:      channel.follow\nTwitch-Eventsub-Subscription-Version:   1\n----\n{\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"status\": \"authorization_revoked\",\n        \"type\": \"channel.follow\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"12826\"\n        },\n        \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    }\n}\n
    \n\n

    To handle a subscription revocation request:

    \n\n
      \n
    1.  Verify the request signature  to make sure it came from Twitch.
    2. \n
    3. Return a 2XX status code.
    4. \n
    \n\n

    Limits

    \n\n

    Twitch enforces limits on the subscriptions you create:

    \n\n
      \n
    • There is a limit of 10,000 total subscriptions.
    • \n
    • There is a limit of 3 subscriptions with the same type and condition values.
    • \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","eventsub-reference":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Request fields
    \n\t\t\n\t\t\t
    Response fields
    \n\t\t\n\t\t\t
    Conditions
    \n\t\t\n\t\t\t
    Events
    \n\t\t\n\t\n\n\n\t\t

    EventSub Reference

    \n\n

    Request fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. The parameters inside this object differ by subscription type and may differ by version.
    transport transport yesTransport-specific parameters.
    \n\n

    Response fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Contains subscription metadata.
    event event The event information. The fields inside this object differ by subscription type.
    \n\n

    Objects

    \n\n

    Conditions

    \n\n

    Channel Ban Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to get ban notifications for.
    \n\n

    Channel Subscribe Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to get subscribe notifications for.
    \n\n

    Channel Cheer Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to get cheer notifications for.
    \n\n

    Channel Update Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to get updates for.
    \n\n

    Channel Follow Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to get follow notifications for.
    \n\n

    Channel Unban Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to get unban notifications for.
    \n\n

    Channel Raid Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    from_broadcaster_user_idstringnoThe broadcaster user ID that created the channel raid you want to get notifications for. Use this parameter if you want to know when a specific broadcaster raids another broadcaster. The channel raid condition must include either from_broadcaster_user_id or to_broadcaster_user_id.
    to_broadcaster_user_idstringnoThe broadcaster user ID that received the channel raid you want to get notifications for. Use this parameter if you want to know when a specific broadcaster is raided by another broadcaster. The channel raid condition must include either from_broadcaster_user_id or to_broadcaster_user_id.
    \n\n

    Channel Points Custom Reward Add Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to receive channel points custom reward add notifications for.
    \n\n

    Channel Points Custom Reward Update Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to receive channel points custom reward update notifications for.
    reward_idstringno\nOptional. Specify a reward id to only receive notifications for a specific reward.
    \n\n

    Channel Points Custom Reward Remove Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to receive channel points custom reward remove notifications for.
    reward_idstringno\nOptional. Specify a reward id to only receive notifications for a specific reward.
    \n\n

    Channel Points Custom Reward Redemption Add Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to receive channel points custom reward redemption add notifications for.
    reward_idstringno\nOptional. Specify a reward id to only receive notifications for a specific reward.
    \n\n

    Channel Points Custom Reward Redemption Update Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to receive channel points custom reward redemption update notifications for.
    reward_idstringno\nOptional. Specify a reward id to only receive notifications for a specific reward.
    \n\n

    Hype Train Begin Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to hype train begin notifications for.
    \n\n

    Hype Train Progress Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to hype train progress notifications for.
    \n\n

    Hype Train End Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID for the channel you want to hype train end notifications for.
    \n\n

    Stream Online Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID you want to get stream online notifications for.
    \n\n

    Stream Offline Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    broadcaster_user_idstringyesThe broadcaster user ID you want to get stream offline notifications for.
    \n\n

    User Authorization Revoke Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    client_idstringyesYour application’s client id. The provided client_id must match the client id in the application access token.
    \n\n

    User Update Condition

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    user_idstringyesThe user ID for the user you want update notifications for.
    \n\n

    Events

    \n\n

    Channel Ban Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe user ID for the user who was banned on the specified channel.
    user_loginstringThe user login for the user who was banned on the specified channel.
    user_namestringThe user display name for the user who was banned on the specified channel.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    \n\n

    Channel Subscribe Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe user ID for the user who subscribed to the specified channel.
    user_loginstringThe user login for the user who subscribed to the specified channel.
    user_namestringThe user display name for the user who subscribed to the specified channel.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    tierstringThe tier of the subscription. Valid values are 10002000, and 3000.
    is_giftbooleanWhether the subscription is a gift.
    \n\n

    Channel Cheer Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    is_anonymousbooleanWhether the user cheered anonymously or not.
    user_idstringThe user ID for the user who cheered on the specified channel. This is null if is_anonymous is true.
    user_loginstringThe user login for the user who cheered on the specified channel. This is null if is_anonymous is true.
    user_namestringThe user display name for the user who cheered on the specified channel. This is null if is_anonymous is true.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    messagestringThe message sent with the cheer.
    bitsintThe number of bits cheered.
    \n\n

    Channel Update Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_user_idstringThe broadcaster’s user ID.
    broadcaster_user_loginstringThe broadcaster’s user login.
    broadcaster_user_namestringThe broadcaster’s user display name.
    titlestringThe channel’s stream title.
    languagestringThe channel’s broadcast language.
    category_idstringThe channel’s category ID.
    category_namestringThe category name.
    is_maturebooleanA boolean identifying whether the channel is flagged as mature. Valid values are true and false.
    \n\n

    Channel Unban Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe user id for the user who was unbanned on the specified channel.
    user_loginstringThe user login for the user who was unbanned on the specified channel.
    user_namestringThe user display name for the user who was unbanned on the specified channel.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    \n\n

    Channel Follow Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe user ID for the user now following the specified channel.
    user_loginstringThe user login for the user now following the specified channel.
    user_namestringThe user display name for the user now following the specified channel.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    \n\n

    Channel Raid Event

    \n\n

    | Name | Type | Description |\n| — | — | — |\n| from_broadcaster_user_id | string | The broadcaster ID that created the raid. |\n| from_broadcaster_user_login | string | The broadcaster login that created the raid. |\n| from_broadcaster_user_name | string | The broadcaster display name that created the raid. |\n| to_broadcaster_user_id | string | The broadcaster ID that received the raid. |\n| to_broadcaster_user_login | string | The broadcaster login that received the raid. |\n| to_broadcaster_user_name | string | The broadcaster display name that received the raid. |\n| viewers | int | The number of viewers in the raid. |

    \n

    Channel Points Custom Reward Add Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe reward identifier.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    is_enabledbooleanIs the reward currently enabled. If false, the reward won’t show up to viewers.
    is_pausedbooleanIs the reward currently paused. If true, viewers can’t redeem.
    is_in_stockbooleanIs the reward currently in stock. If false, viewers can’t redeem.
    titlestringThe reward title.
    costintThe reward cost.
    promptstringThe reward description.
    is_user_input_requiredbooleanDoes the viewer need to enter information when redeeming the reward.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to fulfilled status immediately when redeemed and skip the request queue instead of the normal unfulfilled status.
    max_per_stream max_per_stream Whether a maximum per stream is enabled and what the maximum is.
    max_per_user_per_stream max_per_user_per_stream Whether a maximum per user per stream is enabled and what the maximum is.
    background_colorstringCustom background color for the reward. Format: Hex with # prefix. Example: #FA1ED2.
    image image Set of custom images of 1x, 2x and 4x sizes for the reward. Can be null if no images have been uploaded.
    default_image image Set of default images of 1x, 2x and 4x sizes for the reward.
    global_cooldown global_cooldown Whether a cooldown is enabled and what the cooldown is in seconds.
    cooldown_expires_atstringTimestamp of the cooldown expiration. null if the reward isn’t on cooldown.
    redemptions_redeemed_current_streamintThe number of redemptions redeemed during the current live stream. Counts against the max_per_stream limit. null if the broadcasters stream isn’t live or max_per_stream isn’t enabled.
    \n\n

    Channel Points Custom Reward Update Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe reward identifier.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    is_enabledbooleanIs the reward currently enabled. If false, the reward won’t show up to viewers.
    is_pausedbooleanIs the reward currently paused. If true, viewers can’t redeem.
    is_in_stockbooleanIs the reward currently in stock. If false, viewers can’t redeem.
    titlestringThe reward title.
    costintThe reward cost.
    promptstringThe reward description.
    is_user_input_requiredbooleanDoes the viewer need to enter information when redeeming the reward.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to fulfilled status immediately when redeemed and skip the request queue instead of the normal unfulfilled status.
    max_per_stream max_per_stream Whether a maximum per stream is enabled and what the maximum is.
    max_per_user_per_stream max_per_user_per_stream Whether a maximum per user per stream is enabled and what the maximum is.
    background_colorstringCustom background color for the reward. Format: Hex with # prefix. Example: #FA1ED2.
    image image Set of custom images of 1x, 2x and 4x sizes for the reward. Can be null if no images have been uploaded.
    default_image image Set of default images of 1x, 2x and 4x sizes for the reward.
    global_cooldown global_cooldown Whether a cooldown is enabled and what the cooldown is in seconds.
    cooldown_expires_atstringTimestamp of the cooldown expiration. null if the reward isn’t on cooldown.
    redemptions_redeemed_current_streamintThe number of redemptions redeemed during the current live stream. Counts against the max_per_stream limit. null if the broadcasters stream isn’t live or max_per_stream isn’t enabled.
    \n\n

    Channel Points Custom Reward Remove Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe reward identifier.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    is_enabledbooleanIs the reward currently enabled. If false, the reward won’t show up to viewers.
    is_pausedbooleanIs the reward currently paused. If true, viewers can’t redeem.
    is_in_stockbooleanIs the reward currently in stock. If false, viewers can’t redeem.
    titlestringThe reward title.
    costintThe reward cost.
    promptstringThe reward description.
    is_user_input_requiredbooleanDoes the viewer need to enter information when redeeming the reward.
    should_redemptions_skip_request_queuebooleanShould redemptions be set to fulfilled status immediately when redeemed and skip the request queue instead of the normal unfulfilled status.
    max_per_stream max_per_stream Whether a maximum per stream is enabled and what the maximum is.
    max_per_user_per_stream max_per_user_per_stream Whether a maximum per user per stream is enabled and what the maximum is.
    background_colorstringCustom background color for the reward. Format: Hex with # prefix. Example: #FA1ED2.
    image image Set of custom images of 1x, 2x and 4x sizes for the reward. Can be null if no images have been uploaded.
    default_image image Set of default images of 1x, 2x and 4x sizes for the reward.
    global_cooldown global_cooldown Whether a cooldown is enabled and what the cooldown is in seconds.
    cooldown_expires_atstringTimestamp of the cooldown expiration. null if the reward isn’t on cooldown.
    redemptions_redeemed_current_streamintThe number of redemptions redeemed during the current live stream. Counts against the max_per_stream limit. null if the broadcasters stream isn’t live or max_per_stream isn’t enabled.
    \n\n

    Channel Points Custom Reward Redemption Add Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe redemption identifier.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    user_idstringUser ID of the user that redeemed the reward.
    user_loginstringLogin of the user that redeemed the reward.
    user_namestringDisplay name of the user that redeemed the reward.
    user_inputstringThe user input provided. Empty string if not provided.
    statusstringDefaults to unfulfilled. Possible values are unknownunfulfilledfulfilled, and canceled.
    reward reward Basic information about the reward that was redeemed, at the time it was redeemed.
    redeemed_atstringRFC3339 timestamp of when the reward was redeemed.
    \n\n

    Channel Points Custom Reward Redemption Update Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe redemption identifier.
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    user_idstringUser ID of the user that redeemed the reward.
    user_loginstringLogin of the user that redeemed the reward.
    user_namestringDisplay name of the user that redeemed the reward.
    user_inputstringThe user input provided. Empty string if not provided.
    statusstringWill be fulfilled or canceled. Possible values are unknownunfulfilledfulfilled, and canceled.
    reward reward Basic information about the reward that was redeemed, at the time it was redeemed.
    redeemed_atstringRFC3339 timestamp of when the reward was redeemed.
    \n\n

    Hype Train Begin Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    totalintTotal points contributed to the hype train.
    progressintThe number of points contributed to the hype train at the current level.
    goalintThe number of points required to reach the next level.
    top_contributions top_contributions The contributors with the most points contributed.
    last_contribution last_contribution The most recent contribution.
    started_atstringThe timestamp at which the hype train started.
    expires_atstringThe time at which the hype train expires. The expiration is extended when the hype train reaches a new level.
    \n\n

    Hype Train Progress Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    levelintCurrent level of hype train event.
    totalintTotal points contributed to the hype train.
    progressintThe number of points contributed to the hype train at the current level.
    goalintThe number of points required to reach the next level.
    top_contributions top_contributions The contributors with the most points contributed.
    last_contribution last_contribution The most recent contribution.
    started_atstringThe timestamp at which the hype train started.
    expires_atstringThe time at which the hype train expires. The expiration is extended when the hype train reaches a new level.
    \n\n

    Hype Train End Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_user_idstringThe requested broadcaster ID.
    broadcaster_user_loginstringThe requested broadcaster login.
    broadcaster_user_namestringThe requested broadcaster display name.
    levelintCurrent level of hype train event.
    totalintTotal points contributed to the hype train.
    top_contributions top_contributions The contributors with the most points contributed.
    started_atstringThe timestamp at which the hype train started.
    ended_atstringThe timestamp at which the hype train ended.
    cooldown_ends_atstringThe timestamp at which the hype train cooldown ends so that the next hype train can start.
    \n\n

    Stream Online Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe event id.
    broadcaster_user_idstringThe broadcaster’s user id.
    broadcaster_user_loginstringThe broadcaster’s user login.
    broadcaster_user_namestringThe broadcaster’s user display name.
    typestringThe stream type. Valid values are: liveplaylistwatch_partypremierererun.
    started_atstringThe timestamp at which the stream went online at.
    \n\n

    Stream Offline Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    broadcaster_user_idstringThe broadcaster’s user id.
    broadcaster_user_loginstringThe broadcaster’s user login.
    broadcaster_user_namestringThe broadcaster’s user display name.
    \n\n

    User Authorization Revoke Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    client_idstringThe client_id of the application with revoked user access.
    user_idstringThe user id for the user who has revoked authorization for your client id.
    user_loginstringThe user login for the user who has revoked authorization for your client id. This is null if the user no longer exists.
    user_namestringThe user display name for the user who has revoked authorization for your client id. This is null if the user no longer exists.
    \n\n

    User Update Event

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe user’s user id.
    user_loginstringThe user’s user login.
    user_namestringThe user’s user display name.
    emailstringThe user’s email. Only included if you have the user:read:emailscope for the user.
    descriptionstringThe user’s description.
    \n\n

    Global Cooldown

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    is_enabledbooleanIs the setting enabled.
    secondsintThe cooldown in seconds.
    \n\n

    Image

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    url_1xstringURL for the image at 1x size.
    url_2xstringURL for the image at 2x size.
    url_4xstringURL for the image at 4x size.
    \n\n

    Last Contribution

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe ID of the user.
    user_loginstringThe login of the user.
    user_namestringThe display name of the user.
    typestringType of contribution. Valid values include bitssubscription.
    totalintThe total contributed.
    \n\n

    Max Per Stream

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    is_enabledbooleanIs the setting enabled.
    valueintThe max per stream limit.
    \n\n

    Max Per User Per Stream

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    is_enabledbooleanIs the setting enabled.
    valueintThe max per user per stream limit.
    \n\n

    Reward

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringThe reward identifier.
    titlestringThe reward name.
    costintThe reward cost.
    promptstringThe reward description.
    \n\n

    Subscription

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    idstringYour client ID.
    typestringThe notification’s subscription type.
    versionstringThe version of the subscription.
    condition condition Subscription-specific parameters.
    created_atstringThe time the notification was created.
    \n\n

    Top Contributions

    \n\n

    An array of objects that describe a user, the type of their hype train contribution, and their total contribution amount. Contains a maximum of two user objects: one for the top bits contributor and one for the top subscriptions contributor (this includes gifted subscriptions).

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    user_idstringThe ID of the user.
    user_loginstringThe login of the user.
    user_namestringThe display name of the user.
    typestringType of contribution. Valid values include bitssubscription.
    totalintThe total contributed.
    \n\n

    Transport

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    methodstringyesThe transport method. Supported values: webhook.
    callbackstringyesThe callback URL where the notification should be sent.
    secretstringyesThe secret used for verifying a signature.
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","eventsub-subscription-types":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Channel Subscriptions
    \n\t\t\n\t\t\t
    Stream Subscriptions
    \n\t\t\n\t\t\t
    User Subscriptions
    \n\t\t\n\t\n\n\n\t\t

    Subscription Types

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Subscription TypeNameVersionDescription
    Channel Updatechannel.update1A broadcaster updates their channel properties e.g., category, title, mature flag, broadcast, or language.
    Channel Followchannel.follow1A specified channel receives a follow.
    Channel Subscribechannel.subscribe1A notification when a specified channel receives a subscriber. This does not include resubscribes.
    Channel Cheerchannel.cheer1A user cheers on the specified channel.
    \nChannel Raid BETA\nchannel.raidbetaA broadcaster raids another broadcaster’s channel.
    Channel Banchannel.ban1A viewer is banned from the specified channel.
    Channel Unbanchannel.unban1A viewer is unbanned from the specified channel.
    Channel Points Custom Reward Addchannel.channel_points_custom_reward.add1A custom channel points reward has been created for the specified channel.
    Channel Points Custom Reward Updatechannel.channel_points_custom_reward.update1A custom channel points reward has been updated for the specified channel.
    Channel Points Custom Reward Removechannel.channel_points_custom_reward.remove1A custom channel points reward has been removed from the specified channel.
    Channel Points Custom Reward Redemption Addchannel.channel_points_custom_reward_redemption.add1A viewer has redeemed a custom channel points reward on the specified channel.
    Channel Points Custom Reward Redemption Updatechannel.channel_points_custom_reward_redemption.update1A redemption of a channel points custom reward has been updated for the specified channel.
    Hype Train Beginchannel.hype_train.begin1A hype train begins on the specified channel.
    Hype Train Progresschannel.hype_train.progress1A hype train makes progress on the specified channel.
    Hype Train Endchannel.hype_train.end1A hype train ends on the specified channel.
    Stream Onlinestream.online1The specified broadcaster starts a stream.
    Stream Offlinestream.offline1The specified broadcaster stops a stream.
    User Authorization Revokeuser.authorization.revoke1A user’s authorization has been revoked for your client id.
    User Updateuser.update1A user has updated their account.
    \n\n

    Channel Subscriptions

    \n\n

    channel.update

    \n\n

    The channel.update subscription type sends notifications when a broadcaster updates the category, title, mature flag, or broadcast language for their channel.

    \n\n

    Authorization

    \n\n

    No authorization required.

    \n\n

    Channel Update Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.update.
    versionstringyesThe subscription type version: 1.
    condition condition yesPass in the broadcaster_user_id for the channel you want updates for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Update Webhook Example

    \n\n
    {\n    \"type\": \"channel.update\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Update Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event Returns the user ID, user name, title, language, category ID, category name, and mature flag setting for the given broadcaster.
    \n\n

    Channel Update Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.update\",\n        \"version\": \"1\",\n        \"condition\": {\n           \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"title\": \"Best Stream Ever\",\n        \"language\": \"en\",\n        \"category_id\": \"21779\",\n        \"category_name\": \"Fortnite\",\n        \"is_mature\": false\n    }\n}\n
    \n\n

    channel.follow

    \n\n

    The channel.follow subscription type sends a notification when a specified channel receives a follow.

    \n\n

    Authorization

    \n\n

    No authorization required.

    \n\n

    Channel Follow Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.follow.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Follow Webhook Example

    \n\n
    {\n    \"type\": \"channel.follow\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Follow Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains the user ID and user name of the follower and the broadcaster user ID and broadcaster user name.
    \n\n

    Channel Follow Webhook Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.follow\",\n        \"version\": \"1\",\n        \"condition\": {\n           \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"user_id\": \"1234\",\n        \"user_login\": \"cool_user\",\n        \"user_name\": \"Cool_User\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cooler_user\",\n        \"broadcaster_user_name\": \"Cooler_User\"\n    }\n}\n
    \n\n

    channel.subscribe

    \n\n

    The channel.subscribe subscription type sends a notification when a specified channel receives a subscriber. This does not include resubscribes.

    \n\n

    Authorization

    \n\n

    Must have channel:read:subscriptions scope.

    \n\n

    Channel Subscribe Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.subscribe.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Subscribe Webhook Example

    \n\n
    {\n    \"type\": \"channel.subscribe\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Subscribe Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains the user ID and user name of the subscriber, the broadcaster user ID and broadcaster user name, and whether the subscription is a gift.
    \n\n

    Channel Subscribe Webhook Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.subscribe\",\n        \"version\": \"1\",\n        \"condition\": {\n           \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"user_id\": \"1234\",\n        \"user_login\": \"cool_user\",\n        \"user_name\": \"Cool_User\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cooler_user\",\n        \"broadcaster_user_name\": \"Cooler_User\",\n        \"tier\": \"1000\",\n        \"is_gift\": false\n    }\n}\n
    \n\n

    channel.cheer

    \n\n

    The channel.cheer subscription type sends a notification when a user cheers on the specified channel.

    \n\n

    Authorization

    \n\n

    Must have bits:read scope.

    \n\n

    Channel Cheer Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.cheer.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive cheer notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Cheer Webhook Example

    \n\n
    {\n    \"type\": \"channel.cheer\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Cheer Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains the user ID and user name of the cheering user along with the broadcaster user id and broadcaster user name.
    \n\n

    Channel Cheer Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.cheer\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"is_anonymous\": false,\n        \"user_id\": \"1234\",          // null if is_anonymous=true\n        \"user_login\": \"cool_user\",  // null if is_anonymous=true\n        \"user_name\": \"Cool_User\",   // null if is_anonymous=true\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cooler_user\",\n        \"broadcaster_user_name\": \"Cooler_User\",\n        \"message\": \"pogchamp\",\n        \"bits\": 1000\n    }\n}\n
    \n\n

    channel.raid BETA\n

    \n\n

    The channel.raid subscription type sends a notification when a broadcaster raids another broadcaster’s channel.

    \n\n

    Authorization

    \n\n

    No authorization required.

    \n\n

    Channel Raid Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.raid.
    versionstringyesThe subscription type version: beta.
    condition condition yesSubscription-specific parameters. Pass in either from_broadcaster_user_id or to_broadcaster_user_id. If you pass in both parameters you will receive an error.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Raid Webhook Example

    \n\n
    {\n    \"type\": \"channel.raid\",\n    \"version\": \"beta\",\n    \"condition\": {\n        \"to_broadcaster_user_id\": \"1337\" // could provide from_broadcaster_user_id instead\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Raid Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains the from and to broadcaster information along with the number of viewers in the raid.
    \n\n

    Channel Raid Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.raid\",\n        \"version\": \"beta\",\n        \"condition\": {\n            \"to_broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"from_broadcaster_user_id\": \"1234\",\n        \"from_broadcaster_user_login\": \"cool_user\",\n        \"from_broadcaster_user_name\": \"Cool_User\",\n        \"to_broadcaster_user_id\": \"1337\",\n        \"to_broadcaster_user_login\": \"cooler_user\",\n        \"to_broadcaster_user_name\": \"Cooler_User\",\n        \"viewers\": 9001\n    }\n}\n
    \n\n

    channel.ban

    \n\n

    The channel.ban subscription type sends a notification when a viewer is banned from the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:moderate scope.

    \n\n

    Channel Ban Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.ban.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive ban notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Ban Webhook Example

    \n\n
    {\n    \"type\": \"channel.ban\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Ban Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains the user ID and user name of the banned user as well as the broadcaster user ID and broadcaster user name.
    \n\n

    Channel Ban Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.ban\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"user_id\": \"1234\",\n        \"user_login\": \"cool_user\",\n        \"user_name\": \"Cool_User\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cooler_user\",\n        \"broadcaster_user_name\": \"Cooler_User\"\n    }\n}\n
    \n\n

    channel.unban

    \n\n

    The channel.unban subscription type sends a notification when a viewer is unbanned from the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:moderate scope.

    \n\n

    Channel Unban Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.unban.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive unban notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Unban Webhook Example

    \n\n
    {\n    \"type\": \"channel.unban\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Unban Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains the user ID and user name of the unbanned user as well as the broadcaster user id and broadcaster user name.
    \n\n

    Channel Unban Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.unban\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"user_id\": \"1234\",\n        \"user_login\": \"cool_user\",\n        \"user_name\": \"Cool_User\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cooler_user\",\n        \"broadcaster_user_name\": \"Cooler_User\"\n    }\n}\n
    \n\n

    channel.channel_points_custom_reward.add

    \n\n

    The channel.channel_points_custom_reward.add subscription type sends a notification when a custom channel points reward has been created for the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:read:redemptions or channel:manage:redemptions scope.

    \n\n

    Channel Points Custom Reward Add Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.channel_points_custom_reward.add.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive channel points customer reward add notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Points Custom Reward Add Webhook Example

    \n\n
    {\n    \"type\": \"channel.channel_points_custom_reward.add\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Points Custom Reward Add Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains data about the custom reward added to the broadcaster’s channel.
    \n\n

    Channel Points Custom Reward Add Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.channel_points_custom_reward.add\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"id\": \"9001\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"is_enabled\": true,\n        \"is_paused\": false,\n        \"is_in_stock\": true,\n        \"title\": \"Cool Reward\",\n        \"cost\": 100,\n        \"prompt\": \"reward prompt\",\n        \"is_user_input_required\": true,\n        \"should_redemptions_skip_request_queue\": false,\n        \"cooldown_expires_at\": null,\n        \"redemptions_redeemed_current_stream\": null,\n        \"max_per_stream\": {\n            \"is_enabled\": true,\n            \"value\": 1000\n        },\n        \"max_per_user_per_stream\": {\n            \"is_enabled\": true,\n            \"value\": 1000\n        },\n        \"global_cooldown\": {\n            \"is_enabled\": true,\n            \"seconds\": 1000\n        },\n        \"background_color\": \"#FA1ED2\",\n        \"image\": {\n            \"url_1x\": \"https://static-cdn.jtvnw.net/image-1.png\",\n            \"url_2x\": \"https://static-cdn.jtvnw.net/image-2.png\",\n            \"url_4x\": \"https://static-cdn.jtvnw.net/image-4.png\"\n        },\n        \"default_image\": {\n            \"url_1x\": \"https://static-cdn.jtvnw.net/default-1.png\",\n            \"url_2x\": \"https://static-cdn.jtvnw.net/default-2.png\",\n            \"url_4x\": \"https://static-cdn.jtvnw.net/default-4.png\"\n        }\n    }\n}\n
    \n\n

    channel.channel_points_custom_reward.update

    \n\n

    The channel.channel_points_custom_reward.update subscription type sends a notification when a custom channel points reward has been updated for the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:read:redemptions or channel:manage:redemptions scope.

    \n\n

    Channel Points Custom Reward Update Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.channel_points_custom_reward.update.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive channel points custom reward update notifications for. You can optionally pass in a reward id to only receive notifications for a specific reward.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Points Custom Reward Update Webhook Example

    \n\n
    {\n    \"type\": \"channel.channel_points_custom_reward.update\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"reward_id\": \"9001\" // optional to only get notifications for a specific reward\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Points Custom Reward Update Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Metadata about the subscription.
    event event The event information. Contains data about the custom reward updated on the broadcaster’s channel.
    \n\n

    Channel Points Custom Reward Update Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.channel_points_custom_reward.update\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"id\": \"9001\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"is_enabled\": true,\n        \"is_paused\": false,\n        \"is_in_stock\": true,\n        \"title\": \"Cool Reward\",\n        \"cost\": 100,\n        \"prompt\": \"reward prompt\",\n        \"is_user_input_required\": true,\n        \"should_redemptions_skip_request_queue\": false,\n        \"cooldown_expires_at\": \"2019-11-16T10:11:12.123Z\",\n        \"redemptions_redeemed_current_stream\": 123,\n        \"max_per_stream\": {\n            \"is_enabled\": true,\n            \"value\": 1000\n        },\n        \"max_per_user_per_stream\": {\n            \"is_enabled\": true,\n            \"value\": 1000\n        },\n        \"global_cooldown\": {\n            \"is_enabled\": true,\n            \"seconds\": 1000\n        },\n        \"background_color\": \"#FA1ED2\",\n        \"image\": {\n            \"url_1x\": \"https://static-cdn.jtvnw.net/image-1.png\",\n            \"url_2x\": \"https://static-cdn.jtvnw.net/image-2.png\",\n            \"url_4x\": \"https://static-cdn.jtvnw.net/image-4.png\"\n        },\n        \"default_image\": {\n            \"url_1x\": \"https://static-cdn.jtvnw.net/default-1.png\",\n            \"url_2x\": \"https://static-cdn.jtvnw.net/default-2.png\",\n            \"url_4x\": \"https://static-cdn.jtvnw.net/default-4.png\"\n        }\n    }\n}\n
    \n\n

    channel.channel_points_custom_reward.remove

    \n\n

    The channel.channel_points_custom_reward.remove subscription type sends a notification when a custom channel points reward has been removed from the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:read:redemptions or channel:manage:redemptions scope.

    \n\n

    Channel Points Custom Reward Remove Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.channel_points_custom_reward.remove.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive channel points custom reward remove notifications for. You can optionally pass in a reward ID to only receive notifications for a specific reward.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Points Custom Reward Remove Webhook Example

    \n\n
    {\n    \"type\": \"channel.channel_points_custom_reward.remove\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"reward_id\": \"9001\" // optional to only get notifications for a specific reward\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Points Custom Reward Remove Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event The event information. Contains data about the custom reward removed from the broadcaster’s channel.
    \n\n

    Channel Points Custom Reward Remove Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.channel_points_custom_reward.remove\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\",\n            \"reward_id\": 12345\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"id\": \"9001\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"is_enabled\": true,\n        \"is_paused\": false,\n        \"is_in_stock\": true,\n        \"title\": \"Cool Reward\",\n        \"cost\": 100,\n        \"prompt\": \"reward prompt\",\n        \"is_user_input_required\": true,\n        \"should_redemptions_skip_request_queue\": false,\n        \"cooldown_expires_at\": \"2019-11-16T10:11:12.123Z\",\n        \"redemptions_redeemed_current_stream\": 123,\n        \"max_per_stream\": {\n            \"is_enabled\": true,\n            \"value\": 1000\n        },\n        \"max_per_user_per_stream\": {\n            \"is_enabled\": true,\n            \"value\": 1000\n        },\n        \"global_cooldown\": {\n            \"is_enabled\": true,\n            \"seconds\": 1000\n        },\n        \"background_color\": \"#FA1ED2\",\n        \"image\": {\n            \"url_1x\": \"https://static-cdn.jtvnw.net/image-1.png\",\n            \"url_2x\": \"https://static-cdn.jtvnw.net/image-2.png\",\n            \"url_4x\": \"https://static-cdn.jtvnw.net/image-4.png\"\n        },\n        \"default_image\": {\n            \"url_1x\": \"https://static-cdn.jtvnw.net/default-1.png\",\n            \"url_2x\": \"https://static-cdn.jtvnw.net/default-2.png\",\n            \"url_4x\": \"https://static-cdn.jtvnw.net/default-4.png\"\n        }\n    }\n}\n
    \n\n

    channel.channel_points_custom_reward_redemption.add

    \n\n

    The channel.channel_points_custom_reward_redemption.add subscription type sends a notification when a viewer has redeemed a custom channel points reward on the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:read:redemptions or channel:manage:redemptions scope.

    \n\n

    Channel Points Custom Reward Redemption Add Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.channel_points_custom_reward_redemption.add.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive channel points custom reward redemption notifications for. You can optionally pass in a reward id to only receive notifications for a specific reward.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Points Custom Reward Redemption Add Webhook Example

    \n\n
    {\n    \"type\": \"channel.channel_points_custom_reward_redemption.add\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"reward_id\": \"9001\" // optional to only get notifications for a specific reward\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Points Custom Reward Redemption Add Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event The event information. Contains data about the redemption of the custom reward on the broadcaster’s channel.
    \n\n

    Channel Points Custom Reward Redemption Add Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.channel_points_custom_reward_redemption.add\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"id\": \"1234\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"user_id\": \"9001\",\n        \"user_login\": \"cooler_user\",\n        \"user_name\": \"Cooler_User\",\n        \"user_input\": \"pogchamp\",\n        \"status\": \"unfulfilled\",\n        \"reward\": {\n            \"id\": \"9001\",\n            \"title\": \"title\",\n            \"cost\": 100,\n            \"prompt\": \"reward prompt\"\n        },\n        \"redeemed_at\": \"2020-07-15T17:16:03.17106713Z\"\n    }\n}\n
    \n\n

    channel.channel_points_custom_reward_redemption.update

    \n\n

    The channel.channel_points_custom_reward_redemption.update subscription type sends a notification when a redemption of a channel points custom reward has been updated for the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:read:redemptions or channel:manage:redemptions scope.

    \n\n

    Channel Points Custom Reward Redemption Update Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.channel_points_custom_reward_redemption.update.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to receive channel points custom reward redemption update notifications for. You can optionally pass in a reward id to only receive notifications for a specific reward.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Points Custom Reward Redemption Update Webhook Example

    \n\n
    {\n    \"type\": \"channel.channel_points_custom_reward_redemption.update\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"reward_id\": \"9001\" // optional to only get notifications for a specific reward\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Points Custom Reward Redemption Update Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event The event information. Contains data about the custom reward redemption update from the broadcaster’s channel.
    \n\n

    Channel Points Custom Reward Redemption Update Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.channel_points_custom_reward_redemption.update\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"id\": \"1234\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"user_id\": \"9001\",\n        \"user_login\": \"cooler_user\",\n        \"user_name\": \"Cooler_User\",\n        \"user_input\": \"pogchamp\",\n        \"status\": \"fulfilled\",  // Either fulfilled or cancelled\n        \"reward\": {\n            \"id\": \"9001\",\n            \"title\": \"title\",\n            \"cost\": 100,\n            \"prompt\": \"reward prompt\"\n        },\n        \"redeemed_at\": \"2020-07-15T17:16:03.17106713Z\"\n    }\n}\n
    \n\n

    channel.hype_train.begin

    \n\n

    The channel.hype_train.begin subscription type sends a notification when a hype train begins on the specified channel. In addition to a channel.hype_train.begin event, one channel.hype_train.progress event will be sent for each contribution that caused the hype train to begin. EventSub does not make strong assurances about the order of message delivery, so it is possible to receive channel.hype_train.progress notifications before you receive the corresponding channel.hype_train.begin notification.

    \n\n

    After the hype train begins, any additional cheers or subscriptions on the channel will cause channel.hype_train.progress notifications to be sent. When the hype train is over, channel.hype_train.end is emitted.

    \n\n

    Authorization

    \n\n

    Must have channel:read:hype_train scope.

    \n\n

    Channel Hype Train Begin Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.hype_train.begin.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to hype train begin notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Hype Train Begin Webhook Example

    \n\n
    {\n    \"type\": \"channel.hype_train.begin\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Hype Train Begin Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains hype train information like the level, goal, top contributors, start time, and expiration time.
    \n\n

    Channel Hype Train Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.hype_train.begin\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"total\": 137,\n        \"progress\": 137,\n        \"goal\": 500,\n        \"top_contributions\": [\n            { \"user_id\": \"123\", \"user_login\": \"pogchamp\", \"user_name\": \"PogChamp\", \"type\": \"bits\", \"total\": 50 },\n            { \"user_id\": \"456\", \"user_login\": \"kappa\", \"user_name\": \"Kappa\", \"type\": \"subscription\", \"total\": 45 }\n        ],\n        \"last_contribution\": { \"user_id\": \"123\", \"user_login\": \"pogchamp\", \"user_name\": \"PogChamp\", \"type\": \"bits\", \"total\": 50 },\n        \"started_at\": \"2020-07-15T17:16:03.17106713Z\",\n        \"expires_at\": \"2020-07-15T17:16:11.17106713Z\"\n    }\n}\n
    \n\n

    channel.hype_train.progress

    \n\n

    The channel.hype_train.progress subscription type sends a notification when a hype train makes progress on the specified channel. When a hype train starts, one channel.hype_train.progress event will be sent for each contribution that caused the hype train to begin (in addition to the channel.hype_train.begin event). EventSub does not make strong assurances about the order of message delivery, so it is possible to receive channel.hype_train.progress before you receive the corresponding channel.hype_train.begin.

    \n\n

    After a hype train begins, any additional cheers or subscriptions on the channel will cause channel.hype_train.progress notifications to be sent. When the hype train is over, channel.hype_train.end is emitted.

    \n\n

    Authorization

    \n\n

    Must have channel:read:hype_train scope.

    \n\n

    Channel Hype Train Progress Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.hype_train.progress.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to hype train progress notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Hype Train Progress Webhook Example

    \n\n
    {\n    \"type\": \"channel.hype_train.progress\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Hype Train Progress Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains hype train information like the level, goal, top contributors, last contribution, start time, and expiration time.
    \n\n

    Channel Hype Train Progress Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.hype_train.progress\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"level\": 2,\n        \"total\": 700,\n        \"progress\": 200,\n        \"goal\": 1000,\n        \"top_contributions\": [\n            { \"user_id\": \"123\", \"user_login\": \"pogchamp\", \"user_name\": \"PogChamp\", \"type\": \"bits\", \"total\": 50 },\n            { \"user_id\": \"456\", \"user_login\": \"kappa\", \"user_name\": \"Kappa\", \"type\": \"subscription\", \"total\": 45 }\n        ],\n        \"last_contribution\": { \"user_id\": \"123\", \"user_login\": \"pogchamp\", \"user_name\": \"PogChamp\", \"type\": \"bits\", \"total\": 50 },\n        \"started_at\": \"2020-07-15T17:16:03.17106713Z\",\n        \"expires_at\": \"2020-07-15T17:16:11.17106713Z\"\n    }\n}\n
    \n\n

    channel.hype_train.end

    \n\n

    The channel.hype_train.end subscription type sends a notification when a hype train ends on the specified channel.

    \n\n

    Authorization

    \n\n

    Must have channel:read:hype_train scope.

    \n\n

    Channel Hype Train End Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: channel.hype_train.end.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to hype train end notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    Channel Hype Train End Webhook Example

    \n\n
    {\n    \"type\": \"channel.hype_train.end\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Channel Hype Train End Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains hype train information like the level, top contributors, start time, end time, and cooldown end time.
    \n\n

    Channel Hype Train End Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"channel.hype_train.end\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"level\": 2,\n        \"total\": 137,\n        \"top_contributions\": [\n            { \"user_id\": \"123\", \"user_login\": \"pogchamp\", \"user_name\": \"PogChamp\", \"type\": \"bits\", \"total\": 50 },\n            { \"user_id\": \"456\", \"user_login\": \"kappa\", \"user_name\": \"Kappa\", \"type\": \"subscription\", \"total\": 45 }\n        ],\n        \"started_at\": \"2020-07-15T17:16:03.17106713Z\",\n        \"ended_at\": \"2020-07-15T17:16:11.17106713Z\",\n        \"cooldown_ends_at\": \"2020-07-15T18:16:11.17106713Z\"\n    }\n}\n
    \n\n

    Stream Subscriptions

    \n\n

    stream.online

    \n\n

    The stream.online subscription type sends a notification when the specified broadcaster starts a stream.

    \n\n

    Authorization

    \n\n

    No authorization required.

    \n\n

    Stream Online Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: stream.online.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to get updates for.
    transport transport yesTransport-specific parameters.
    \n\n

    Stream Online Webhook Example

    \n\n
    {\n    \"type\": \"stream.online\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Stream Online Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains the stream ID, broadcaster user ID, broadcaster user name, and the stream type.
    \n\n

    Stream Online Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"stream.online\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"id\": \"9001\",\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\",\n        \"type\": \"live\",\n        \"started_at\": \"2020-10-11T10:11:12.123Z\"\n    }\n}\n
    \n\n

    stream.offline

    \n\n

    The stream.offline subscription type sends a notification when the specified broadcaster stops a stream.

    \n\n

    Authorization

    \n\n

    No authorization required.

    \n\n

    Stream Offline Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: stream.offline.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the broadcaster user ID for the channel you want to get updates for.
    transport transport yesTransport-specific parameters.
    \n\n

    Stream Offline Webhook Example

    \n\n
    {\n    \"type\": \"stream.offline\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"broadcaster_user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    Stream Offline Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains the broadcaster user ID and broadcaster user name.
    \n\n

    Stream Offline Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"stream.offline\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"broadcaster_user_id\": \"1337\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\",\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        }\n    },\n    \"event\": {\n        \"broadcaster_user_id\": \"1337\",\n        \"broadcaster_user_login\": \"cool_user\",\n        \"broadcaster_user_name\": \"Cool_User\"\n    }\n}\n
    \n\n

    User Subscriptions

    \n\n

    user.authorization.revoke

    \n\n

    The user.authorization.revoke subscription type sends a notification when a user’s authorization has been revoked for your client id. Use this webhook to meet government requirements for handling user data, such as GDPR, LGPD, or CCPA.

    \n\n

    Authorization

    \n\n

    Provided client_id must match the client id in the application access token.

    \n\n

    User Authorization Revoke Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: user.authorization.revoke.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the client ID of the application you want to get user authorization revoke notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    User Authorization Revoke Webhook Example

    \n\n
    {\n    \"type\": \"user.authorization.revoke\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"client_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    User Authorization Revoke Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains your application’s client ID and the user ID of the user who revoked authorization for your application.
    \n\n

    User Authorization Revoke Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"user.authorization.revoke\",\n        \"version\": \"1\",\n        \"condition\": {\n            \"client_id\": \"crq72vsaoijkc83xx42hz6i37\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"client_id\": \"crq72vsaoijkc83xx42hz6i37\",\n        \"user_id\": \"1337\",\n        \"user_login\": \"cool_user\",  // Null if the user no longer exists\n        \"user_name\": \"Cool_User\"    // Null if the user no longer exists\n    }\n}\n
    \n\n

    user.update

    \n\n

    The user.update subscription type sends a notification when user updates their account.

    \n\n

    Authorization

    \n\n

    No authorization required. If you have the user:read:email scope, the notification will include email field.

    \n\n

    User Update Request Body

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeRequired?Description
    typestringyesThe subscription type name: user.update.
    versionstringyesThe subscription type version: 1.
    condition condition yesSubscription-specific parameters. Pass in the user ID for the user you want update notifications for.
    transport transport yesTransport-specific parameters.
    \n\n

    User Update Webhook Example

    \n\n
    {\n    \"type\": \"user.update\",\n    \"version\": \"1\",\n    \"condition\": {\n        \"user_id\": \"1337\"\n    },\n    \"transport\": {\n        \"method\": \"webhook\",\n        \"callback\": \"https://example.com/webhooks/callback\",\n        \"secret\": \"s3cRe7\"\n    }\n}\n
    \n\n

    User Update Notification Payload

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    NameTypeDescription
    subscription subscription Subscription information.
    event event Event information. Contains the user ID, user name, and description. The user’s email is included if you have the user:read:emailscope for the user.
    \n\n

    User Update Notification Example

    \n\n
    {\n    \"subscription\": {\n        \"id\": \"f1c2a387-161a-49f9-a165-0f21d7a4e1c4\",\n        \"type\": \"user.update\",\n        \"version\": \"1\",\n        \"condition\": {\n           \"user_id\": \"1337\"\n        },\n         \"transport\": {\n            \"method\": \"webhook\",\n            \"callback\": \"https://example.com/webhooks/callback\"\n        },\n        \"created_at\": \"2019-11-16T10:11:12.123Z\"\n    },\n    \"event\": {\n        \"user_id\": \"1337\",\n        \"user_login\": \"cool_user\",\n        \"user_name\": \"Cool_User\",\n        \"email\": \"user@email.com\",  // Requires user:read:email scope\n        \"description\": \"cool description\"\n    }\n}\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","extensions":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    What is a Twitch Extension?
    \n\t\t\n\t\t\t
    How do Extensions work?
    \n\t\t\n\t\t\t
    What can I do with an Extension?
    \n\t\t\n\t\t\t
    Build your first Extension
    \n\t\t\n\t\t\t
    Develop your Extension
    \n\t\t\n\t\t\t
    Stories
    \n\t\t\n\t\t\t
    Architectural Reference
    \n\t\t\n\t\t\t
    Configuration
    \n\t\t\n\t\t\t
    Identity
    \n\t\t\n\t\t\t
    Extension Types
    \n\t\t\n\t\t\t
    Extension Helper
    \n\t\t\n\t\t\t
    Security Model
    \n\t\t\n\t\t\t
    ext-twitch.tv
    \n\t\t\n\t\t\t
    Restrictions on content
    \n\t\t\n\t\n\n\n\t\t

    Get started with Twitch Extensions

    \n\n

    What is a Twitch Extension?

    \n\n

    A Twitch Extension is a webpage that sits inside Twitch and communicates with Twitch to provide extra functionality. For example, the Hearthstone Deck Tracker extension adds an interactive overlay allowing viewers to browse through the cards the streamer is using and their effects.

    \n\n

    Twitch Extensions can appear in one of three views:

    \n\n
      \n
    • \nPanel Extension - Displays in a box under the video.
    • \n
    • \nOverlay Extension - Displays on top of the whole video as a transparent overlay.
    • \n
    • \nComponent Extension - Displays as part of the video, taking up part of the screen. Component Extensions can be hidden by viewers.
    • \n
    \n\n

    How do Extensions work?

    \n\n

    A Twitch Extension sits in a specially sandboxed iframe inside Twitch and communicates with its parent via postMessage. We handle all the nitty-gritty of forming these messages, and provide a Javascript API to the extension called the Extension Helper. This is a high level API allowing the extension to request things like user identity and chat.

    \n\n
    %% Extensions Overview Diagram\ngraph LR\n    Twitch --> | - postMessage - | Extension\n    Extension --> | - postMessage - | Twitch\n    Extension --> | - HTTP - | APIs\n    Extension --> | - HTTP - | EBS[Extension Backend]\n    Identity --> Twitch\n    Chat --> Twitch\n    Memes --> Twitch\n
    \n\n

    What can I do with an Extension?

    \n\n

    Being a webpage, an extension can do almost anything you can already do on the web, such as play sounds and show video. We provide some special functionality for you including:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    UserStream
    [Posting in Chat][Read Information about the Game and Video]
    [Twitch.ext.onContext]
    [Follow Channels][Twitch.ext.actions.followChannel][Get the user’s Language]
    [Client Query Parameters]
    [Get Subscription Status][isSubscriptionStatusAvailable] 
    [Microtransactions] 
    \n\n

    Build your first Extension

    \n\n

    It’s easier than you might think to make a simple Twitch Extension. Extensions are simply webpages, and the only basic requirement is to import the Extension Helper.

    \n\n

    Here’s an extension that just says ‘Hello, world!’:

    \n\n
    <!DOCTYPE HTML>\n<title>Hello World!</title>\n<p>Hello, world!</p>\n<script src=\"https://extension-files.twitch.tv/helper/v1/twitch-ext.min.js\"></script>\n\n<!-- index.html -->\n
    \n\n

    Configure the Extension

    \n\n

    Configuring an Extension requires a few steps:

    \n\n\n\n\n \n \n \n \n \n
    \"Console
    \n\n
      \n
    • Pick a type for your Extension. For this example, we’ll use a Panel Extension.
    • \n
    \n\n\n \n \n \n \n \n
    \"Choose
    \n\n
      \n
    • Fill in any optional fields you choose.
    • \n
    \n\n\n \n \n \n \n \n
    \"Optional
    \n\n
      \n
    • After filling in the optional fields, click Create Extension Version. You now have an extension!
    • \n
    • Click View on Twitch and Install to add your extension to your channel. The config window should be blank.
    • \n
    • Close the config window and click the Activate button on your extension. Choose a slot for the extension. Now it’s added to your channel!
    • \n
    \n\n

    Extensions needs to know what the starting point is for your panel. Set the Panel Viewer Path to index.html (the name of our panel HTML file).

    \n\n\n \n \n \n \n \n
    \"Panel
    \n\n

    Package your Extension

    \n\n

    When you send Twitch an Extension, you need to bundle the Extension files into a zip file. Make sure you are bundling the files, not the folder containing your Extension files.

    \n\n

    To upload your zip file to Twitch, choose Files > Upload Version in Assets > Choose File. Then click the purple Upload button at the bottom.

    \n\n

    Now we’re ready to move to Hosted Test. Click Next Step in the top right, click Move To Hosted Test, and confirm your choice.

    \n\n

    If you go to your Twitch channel now, you’ll see your Extension!

    \n\n

    \"Hello

    \n\n

    Unless you’re in dark mode, in which case the black text won’t show up against the black background. To fix that, repeat the previous steps, this time changing the text color.

    \"Hello

    \n\n

    Develop your Extension

    \n\n

    The easiest way to develop your extension is probably to use the Local Test function. This points Twitch Extensions to your local computer, letting you develop and update Extensions on the fly, while seeing the results in Twitch.

    \n\n

    By default, your base URI, where we look for the extensions files, is set to https://localhost:8080/. Note the https in this URL. Because Twitch is served over HTTPS, your browser will reject the extension unless it’s also served over HTTPS. Depending on your operating system, convincing your browser your extension is safe can be a bit tricky.

    \n\n

    HTTPS on localhost: the easy way

    \n\n

    Technically speaking, HTTPS doesn’t make a lot of sense when it comes to loading your local extension. HTTPS encrypts information in transit as it goes over the internet and makes it secure, but if you’re just communicating from your local machine to your local machine there’s not really anyone who could intercept and decrypt it. As a result, a few browsers either accept locally hosted content as though it were HTTPS, or have a flag to do so.

    \n\n

    We recommend using Google Chrome. In the browser, enable the flag allow insecure localhost. To enable this flag, navigate to: chrome://flags/#allow-insecure-localhost and restarting your browser.

    \n\n

    Once you have restarted your browser, open an HTTP server on localhost:8080, and change the base URI.

    \n\n

    An easy way to launch an HTTP server in the folder your index.html is in is to use Python:

    \n\n
    python3 -m http.server     # python 3\npython -m SimpleHTTPServer # python 2\n
    \n\n

    Then, change your base URI in the Asset Hosting page of your control panel from https://localhost:8080 to http://localhost:8080.

    \n\n

    Now you can skip over the hard way and congratulate yourself on a job well done.

    \n\n

    HTTPS on localhost: the hard way

    \n\n

    We recommend using a tool called mkcert, which will create and install an HTTPS certificate. After you install mkcert, generate a certificate for HTTPS:

    \n\n
    # if you have the Go programming language installed, you\n# can replace 'mkcert' in the following line with go run github.com/FiloSottile/mkcert\n# to automatically download, install and run it.\nmkcert -install localhost\n# > The certificate is at \"./localhost.pem\" and the key at \"./localhost-key.pem\"\n
    \n\n

    Use this certificate to start a server. With Python installed, create a server.py in the same folder as your index.html:

    \n\n
    #!/usr/bin/env/python\nimport BaseHTTPServer, SimpleHTTPServer\nimport ssl\n\ncert_file = \"./localhost.pem\"\nkey_file = \"./localhost-key.pem\"\n\nclass RequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):\n    def end_headers(self):\n        self.send_header(\"Cache-Control\", \"no-cache, no-store, must-revalidate\")\n        self.send_header(\"Pragma\", \"no-cache\")\n        self.send_header(\"Expires\", \"0\")\n        SimpleHTTPServer.SimpleHTTPRequestHandler.end_headers(self)\n\nhttpd = BaseHTTPServer.HTTPServer(\n    ('', 8080),\n    RequestHandler\n)\n\nhttpd.socket = ssl.wrap_socket(\n    httpd.socket,\n    server_side=True,\n    keyfile=key_file,\n    certfile=cert_file\n)\n\nhttpd.serve_forever()\n
    \n\n

    Now run:

    \n\n
    python server.py\n
    \n\n

    Congratulate yourself

    \n\n

    Whether you did it the easy way or the hard way, you got your server started. Now, move back to local test to have the development version show up:
    \"Move

    \n\n

    When you load your page you should see what you saw before:
    \"Hello

    \n\n

    To be sure, edit the page and then refresh. You can also click the little arrow icon to pop it out to just focus on the extension.
    \"Hello

    \n\n

    Stories

    \n\n

    Build an Extension with Create React-App

    \n\n

    Since extensions are such front-end heavy applications, it’s common to use modern frontend libraries like React. While these instructions are specific to React, they should extrapolate to other similar frameworks. For this section, please already have extension set to Local Test.

    \n\n

    All you need to start is a working yarn installation, then you can run create-react-app:

    \n\n
    yarn create react-app example-extension\n
    \n\n

    This should take a little while as React gets your development environment set up. 

    \n\n

    If you’re unfamiliar with create-react-app, it might be worth running yarn start in the directory yarn created. This will launch a server based on the react code in src/. Any code changes in src/ will cause live changes to the page create-react-app just opened. You’ll want to close it before continuing to the next steps.

    \n\n

    There are two things we need to do to make this work with Extensions. First, we need to add the Extension Helper, then we need to add HTTPS support to our create-react-app install.

    \n\n

    To add the Extension Helper, just add the extension helper script to public/index.html between <body> tags:

    \n\n
    <!-- ... -->\n  <body>\n    <script src=\"https://extension-files.twitch.tv/helper/v1/twitch-ext.min.js\"></script>\n<!-- ... -->\n  </body>\n<!-- ... -->\n
    \n\n

    Next, set up HTTPS. You can avoid this step in Google Chrome by setting a flag as described previously. If you do that, you can run yarn start now.

    \n\n

    You’ll find install instructions for mkcert on its Github page.

    \n\n

    Save the following script as install_cert.sh:

    \n\n
    #!/usr/bin/env bash\nmkcert -install \\\n    -cert-file cert.pem \\\n    -key-file key.pem \\\n    localhost\ncat cert.pem key.pem > node_modules/webpack-dev-server/ssl/server.pem\nrm cert.pem key.pem\n
    \n\n

    Next, make some modifications to package.json to:

    \n\n
      \n
    • Run this script to configure HTTPS for anyone who uses your project.
    • \n
    • Require HTTPS on start.
    • \n
    \n\n

    Modify the scripts part of your package.json to modify start and add postinstall as shown:

    \n\n
    // ...\n  \"scripts\": {\n    \"start\": \"HTTPS=true PORT=8080 react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"postinstall\": \"sh install_cert.sh\"\n// ...\n
    \n\n

    Note that PORT=8080 changes the server to be served at https://localhost:8080, the default is https://localhost:3000. You can omit this, but you’ll need to change your Base URI.

    \n\n

    Finally, run yarn postinstall to install your certificates, and yarn start to start the server.

    \n\n

    With your server started, check out your cool new react extension!
    \"new

    \n\n

    Google Analytics

    \n\n

    Use of Google Analytics is allowed in a Twitch Extension. However, due to restrictions on content, it must be included as a javascript file.

    \n\n

    Typically, your Google Analytics snippet will look like this:

    \n\n
    (function(i, s, o, g, r, a, m) {\n    i['GoogleAnalyticsObject'] = r;\n    i[r] = i[r] || function() {\n        (i[r].q = i[r].q || []).push(arguments)\n    }, i[r].l = 1 * new Date();\n    a = s.createElement(o), m = s.getElementsByTagName(o)[0];\n    a.async = 1;\n    a.src = g;\n    m.parentNode.insertBefore(a, m)\n})(window, document, 'script', 'https://www.google-analytics.com/analytics.js', 'ga');\nga('create', 'UA12345678', 'auto');\nga('set', 'anonymizeIp', true);\n
    \n\n\n \n \n \n \n \n
    \nNote: If you attempt to store or process any of this data, you will need to be compliant with European GDPR law about capturing IP address information.
    \n\n

    With an Extension, you just need to add this to a file and import it. For example, if you had this saved as analytics.js, you might import it into your page with <script src=\"analytics.js\"></script>.

    \n\n

    If you’re using a more elaborate Javascript setup with a bundler, you can add it to any of your Javascript, such as src/App.js.

    \n\n

    The Google Analytics script just inserts a <script async='https://www.google-analytics.com/analytics.js'></script>. You might wish to add this to your HTML directly, and instead call the ga() functions in your own javascript bundle.

    \n\n

    Google WebFonts

    \n\n

    Typically, an extension cannot load fonts outside of a Twitch Extension. This helps to prevent sneaky font attacks.

    \n\n

    However Google WebFonts is allowed. Both of the forms allowed by Google WebFonts will work:

    \n\n
    <link href=\"https://fonts.googleapis.com/css?family=Roboto&display=swap\" rel=\"stylesheet\">\n
    \n\n
    @import url('https://fonts.googleapis.com/css?family=Roboto&display=swap');\n
    \n\n

    Pushing announcements to Extensions

    \n\n

    Twitch Extensions can use PubSub to push out real time notifications to all extensions at once. This is a robust service based on the same technologies as Twitch Chat.

    \n\n

    Architectural Reference

    \n\n

    Configuration

    \n\n

    Bits Support

    \n\n

    The Bits Support config allows this extension to use APIs to request bits from the user via the Twitch.ext.bits Javascript APIs.

    \n\n

    Base URI

    \n\n

    The Base URI is the location of the folder containing your extension used in local testing. When an extension in testing loads, the Base URI is combined with the Panel Viewer Path, or Config Path, to work out where to load your web content from. Unlike a web origin it must end with /.

    \n\n

    For example, if loading a Panel Extension in testing with Base URI https://localhost:8080/ and Panel Viewer Path index.html?view=panel, the Extension will load https://localhost:8080/index.html?view=panel.

    \n\n

    Panel Viewer Path

    \n\n

    The Panel Viewer Path is the path that will be loaded when a Panel Extension is loaded. It is combined with the Base URI to decide what location to load an extension from when an extension is in Local Test.

    \n\n

    Panel Height

    \n\n

    The Panel Height is the height in pixels of this extension when displayed as a Panel Extension on a broadcaster’s channel.

    \n\n

    Config Path

    \n\n

    The Config Path is the path that will be loaded when the config for an extension is shown to a broadcaster. It is combined with the Base URI to decide what location to load when an extension is in Local Test.

    \n\n

    Live Config Path

    \n\n

    The Live Config Path is the path that will be loaded when the extension is viewed from the Live module of the Twitch Dashboard. The streamer can then take actions via this page without leaving their dashboard. It is combined with the Base URI to get the full URL to load when an extension is in Local Test.

    \n\n

    Type of Extension

    \n\n

    The Type of Extension configuration field allows you to select how you want your Extension to be displayed. If an Extension type is not picked here, a user of your Extension will not be able to use it in that way. For example, if the ‘Panel’ Extension type is not picked, a user of this extension will not be able to activate it as a Panel Extension.

    \n\n

    Identity

    \n\n

    Opaque Identifier

    \n\n

    Initially, an extension does not have access to the identity of the user that is using it. Twitch.ext.onAuthorized will return a special kind of userId called an Opaque Identifier. Opaque Identifiers come in two types:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    TypeStatePersistent across sessions?
    AnonymousUser is logged out of TwitchNo
    UnauthorizedUser is logged into TwitchYes
    \n\n

    If a user is logged into Twitch, you will get an opaque userId starting with U-. This allows you to uniquely identify the user across sessions even before knowing who they are, but does not disclose their identity.

    \n\n

    If the user is not logged into Twitch, you will get a userId starting with A-. This identifier will change between sessions.

    \n\n

    Extension Types

    \n\n

    Panel Extension

    \n\n

    A Panel Extension sits with the rest of the user profile content at the bottom of a Twitch channel.
    \"Panel

    \n\n

    Overlay Extension

    \n\n

    An Overlay Extension displays on top of the whole video as a transparent overlay.\"Overlay

    \n\n

    Component Extension

    \n\n

    A Component Extension displays as part of the video, taking up part of the screen. Component Extensions can be hidden by viewers.

    \n\n

    \"Component

    \n\n

    Extension Helper

    \n\n

    The Extension Helper is a Javascript library that runs inside an extension. Without it, an extension will not work. It exposes a Javascript API that can perform actions not normally accessible through our web APIs.

    \n\n

    Security Model

    \n\n

    The Extensions system deploys heavy sandboxing and Content Security Policy constraints to make it extremely hard to abuse an Extension. These elements make up the extensions Security Model.

    \n\n
    %% Security Model Diagram\ngraph LR\n    Twitch[Twitch.tv] --> | embeds | Supervisor[Extension Supervisor]\n    Supervisor -->  | embeds | Extension[Twitch Extension]\n
    \n\n

    ext-twitch.tv

    \n\n
    %% ext-twitch.tv\ngraph TD\n    ext-twitch.tv --> my-extension.ext-twitch.tv\n    ext-twitch.tv --> your-extension.ext-twitch.tv\n
    \n\n

    ext-twitch.tv is the host for all Extensions. For historical reasons, subdomains of a domain like myextension.twitch.tv are given certain access rights over twitch.tv. For example, due to historical Cookie Security policies, myextension.twitch.tv can add cookies to twitch.tv, potentially overwriting a user’s existing session.

    \n\n

    For this reason, Twitch Extensions are all based on ext-twitch.tv. This causes the web browser to treat twitch Extensions as entirely separate to twitch.tv itself.

    \n\n

    ext-twitch.tv is also the host of the Extension Supervisor, which embeds the extensions themselves.

    \n\n

    Extension Supervisor

    \n\n

    The Extension Supervisor is located at supervisor.ext-twitch.tv. When an Extension loads in Twitch, Twitch embeds the Extension Supervisor and sends a message to the supervisor indicating what extension to load.

    \n\n

    The supervisor generates a Content Security Policy frame-src directive that prevents the Extension from loading anything other than the Extension, and then embeds the Extension itself as an iframe.

    \n\n

    This prevents bad actors from making an Extension load content which isn’t vetted by the Extensions Review Process.

    \n\n

    Restrictions on content

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Content TypePolicy NameAllowed
    Defaultdefault-srcOnly the extension’s own files and the Extension Helper
    Imagesimg-src✅ All
    Sound and Videomedia-src✅ All
    Javascript-loaded remote contentconnect-src✅ All
    CSSstyle-src✅ In <style> tags and style= attributes, and the extension’s own files
    Fontsfont-srcGoogle WebFonts and the extension’s own files
    Scripts (Javascript)script-srcGoogle Analytics and the extension’s own files
    Embedded iframe contentframe-src
    Insecure contentblock-all-mixed-content
    \n\n

    Content Security Policy is a relatively new set of protocols that help to prevent hackers and other bad actors from taking over web content. Twitch Extensions’ policy specifies what kind of content can be loaded and from where. Since attackers goal is usually to inject their own code, the policy prevents nearly all cross-site scripting and redress attacks.

    \n\n

    For reference, here’s Twitch Extensions’ current Content Security Policy:

    \n\n
    Content-Security-Policy: connect-src https: wss: https://www.google-analytics.com https://stats.g.doubleclick.net; default-src 'self'; block-all-mixed-content; img-src * data: blob:; media-src * data: blob:; frame-ancestors https://supervisor.ext-twitch.tv https://extension-files.twitch.tv https://*.twitch.tv https://*.twitch.tech https://localhost.twitch.tv:* https://localhost.twitch.tech:* http://localhost.rig.twitch.tv:*; font-src https://fonts.googleapis.com https://fonts.gstatic.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; script-src 'self'https://extension-files.twitch.tv https://www.google-analytics.com;\n
    \n\n

    Default restrictions on content

    \n\n

    default-src is a Content Security Policy directive that is used as a fallback for all content that doesn’t have a specific policy associated with it.

    \n\n

    For a Twitch Extension, this is the Extension’s own origin. That is, where there is no other specific policy, an Extension may only load its own files.

    \n\n
    default-src 'self'\n
    \n\n

    Restrictions on fonts

    \n\n

    font-src is a Content Security Policy that restricts where fonts can be loaded from. In the case of extensions, this is set to 'self, https://fonts.googleapis.com, and https://fonts.gstatic.com. This allows use of Google WebFonts while helping to prevent sneaky font attacks.

    \n\n
    font-src https://fonts.googleapis.com https://fonts.gstatic.com\n
    \n\n

    Restrictions on CSS

    \n\n

    style-src is a Content Security Policy directive that restricts where style information can be loaded from. In the case of extensions, this is set to 'self' 'unsafe-inline' and https://fonts.google.com. This means that stylesheets such as CSS can be loaded from the extension’s own files, Google WebFonts, and injected directly into the HTML.

    \n\n

    This means that without proper cross-site scripting protection, an attacker can change the styles of a Twitch Extension.

    \n\n
    style-src 'self' 'unsafe-inline' https://fonts.googleapis.com\n
    \n\n

    Restrictions on scripts

    \n\n

    script-src is a Content Security Policy directive that restricts where scripts such as Javascript can be loaded from. In the case of Extensions, this is set to 'self', https://extension-files.twitch.tv, and https://www.google-analytics.com. This means an extension can only load scripts from itself, https://extension-files.twitch.tv (where the Extension Helper is located), and from Google Analytics.

    \n\n
    script-src 'self' https://extension-files.twitch.tv https://www.google-analytics.com;\n
    \n\n

    Restrictions on Javascript HTTP requests

    \n\n

    connect-src is a Content Security Policy directive that restricts what URLs Javascript can load data from.

    \n\n

    For extensions, this is any https: or wss: (secure websocket) URL. This means that Javascript in an extension is allowed to connect to any secure websocket, or load any secure web content via the [XHR] or [fetch API]s.

    \n\n
    connect-src https: wss:\n
    \n\n

    Restrictions on images

    \n\n

    img-src is a Content Security Policy directive that restricts where a webpage can load images. For a Twitch Extension, this policy allows *, data:, and blob:. This allows images to be loaded from anywhere on the internet, as well as from Javascript memory and inline [data URI]s. This means that potentially without proper [Cross-Site Scripting] protection, an attacker will be able to load images from anywhere on the internet into an extension.

    \n\n
    img-src * data: blob:\n
    \n\n

    Restrictions on media

    \n\n

    media-src is a Content Security Policy directive that restricts where a webpage can load video and sound from. For a Twitch Extension, this policy allows *, data:, and blob:. This allows media to be loaded from anywhere on the internet, as well as from Javascript memory and inline data URIs. This means that potentially without proper cross-site scripting protection, an attacker will be able to load video and audio from anywhere on the internet into an extension.

    \n\n
    media-src * data: blob:\n
    \n\n

    Restrictions on Iframes

    \n\n

    frame-src is a Content Security Policy directive that restricts what pages can be embedded in a webpage. In the context of a Twitch Extension, the Extension Supervisor sets a frame-src that prevents anything but the Extension itself being embedded.

    \n\n

    Restrictions on browser APIs

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ActionPolicy NameAllowed
    HTML Formsallow-forms
    Popup windows (of webpages)allow-popups
    Unsandboxed popupsallow-popups-to-escape-sandbox
    Run Scriptsallow-scripts
    Have own web origin†allow-same-origin
    Downloads without user interactionallow-downloads-without-user-activation
    \nalert(), prompt(), print(), confirm(), other modalsallow-modals
    Lock the orientation of the screenallow-orientation-lock
    Lock the pointer to the extensionallow-pointer-lock
    Start a presentation sessionallow-presentation-session
    Access Twitch cookies with user confirmationallow-storage-access-by-user-activation
    Navigate Twitch to somewhere elseallow-top-navigation
    Navigate Twitch to somewhere else, if the user clicks a linkallow-top-navigation-by-user-activation
    \n\n

    † allows the Extension to load its own content, use CORS, and set and read cookies amongst other things.

    \n\n

    Extensions use iframe sandboxing to prevent Extensions messing with Twitch without permission. This includes opening popups that might appear to be from Twitch, locking the cursor to the Extension amongst other things. The current sandbox configuration is:

    \n\n
    allow-forms allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","a-b-testing-in-extensions":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Step 1: Identify your Goal
    \n\t\t\n\t\t\t
    Step 2: Create a Variation
    \n\t\t\n\t\t\t
    Step 3: Monitor User Behavior in your Extension
    \n\t\t\n\t\t\t
    Step 4: Analyze Results and Draw Conclusions
    \n\t\t\n\t\t\t
    Sample Code
    \n\t\t\n\t\n\n\n\t\t

    Using A/B Testing in Extensions

    \n\n

    Introduction

    \n\n

    A/B testing is a method of testing the performance of different variants of a web-page that is shown to users at random. Developers can analyze the resulting test statistics to see which page variant helped users achieve a predetermined conversion goal - for example, a completed purchase.

    \n\n

    The process of implementing A/B testing has four steps:

    \n\n

    Step 1: Identify your Goal

    \n\n

    Identify the goal of your A/B testing. For example, are you interested in whether users click a certain link or button, or do you want to follow a user’s “page-path” through the extension (the sequence of pages a user clicks while navigating through an extension)?

    \n\n

    Step 2: Create a Variation

    \n\n
      \n
    1. Statistically identify the population for each variation. For example, you can split a population into two groups by performing an odd/even check on broadcaster ID.
    2. \n
    3. For each of the resulting groups, enable or disable a feature in your front end.
    4. \n
    5. Use conditional styling (CSS) to hide or display different elements in each group.
    6. \n
    \n\n

    Step 3: Monitor User Behavior in your Extension

    \n\n

    Record events as users interact with your extension. For example, record the button clicks or page-path mentioned in Step 1.

    \n\n

    Step 4: Analyze Results and Draw Conclusions

    \n\n

    Analyze the data you collected. If there is a clear winner, deploy it. If the test is inconclusive, see what insights you can draw from your data and test them in subsequent rounds of A/B tests. 

    \n\n

    Sample Code

    \n\n
    twitch.ext.onAuthorized(function (auth) {\n  //Let’s assume this returns a valid TUID by decoding the token\n  tuid = getUserID(auth.token);\n  // enable the GREEN button for even number Broadcaster ID\n  if (value%2 == 0){\n      $('#redButton).hide();\n    $('#greenButton).show();\n  }\n  else{\n     $('#redButton).show();\n    $('#greenButton).hide();\n  }\n});\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","building":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Creating An Extension Front End
    \n\t\t\n\t\t\t
    Creating Your Extension Backend Service (EBS)
    \n\t\t\n\t\t\t
    Using the Configuration Service
    \n\t\t\n\t\t\t
    Managing Extension Secrets
    \n\t\t\n\t\n\n\n\t\t

    Building Extensions

    \n\n

    Creating An Extension Front End

    \n\n

    As previously defined, extensions are front-end iframes. Now that you have created your extension and defined its settings, you are ready to create the assets that will live within the iframe.

    \n\n

    Mobile Support

    \n\n

    If your extension is intended for mobile devices, you can provide a second front end for those devices. You can use an identical front end for mobile and web, if it is responsive enough to render and perform well on both platforms; otherwise, submit different front ends.

    \n\n

    On the Twitch developer site, you are prompted to submit separate front ends for web and mobile. If you use the same viewer HTML for both web and mobile, we enable you to customize your behavior based on the native platform by providing your viewer with the query strings ?platform=mobile and ?platform=web.

    \n\n

    Proper layout, rendering, performance, and interaction on mobile devices are not the same as they are on the web, so if you provide mobile support, test your extension thoroughly on the Twitch mobile app.

    \n\n

    Note: Due to requirements communicated to us by Apple, Extensions support on iOS devices (including the ability to test on iOS) is restricted to Apple Developer Program members. If you develop a mobile Extension for iOS, please make sure you have an Apple developer account, and then fill out this form to request iOS support.

    \n\n

    Extension Helper Library

    \n\n

    An extension’s iframe must import the Extension Helper JavaScript file, created and hosted by Twitch. It provides methods for dealing with authentication, receiving notifications of stream properties, and listening to PubSub events. Each HTML defined in the Asset Hosting section of your extension (Viewer, Config, Live Config) must load the Extension Helper. To do so, include this line:

    \n\n
    <script src=\"https://extension-files.twitch.tv/helper/v1/twitch-ext.min.js\"></script>\n
    \n\n

    For details on the Extension Helper, including the callbacks and functions it provides, see the Extensions Reference.

    \n\n

    Creating Your Extension Backend Service (EBS)

    \n\n

    The EBS is your optional backend service that supports the extension. Your EBS can be written in whatever language you prefer. Depending on the nature of your extension, it generally should be capable of the operations described below.

    \n\n

    Note: An extension without an EBS usually acts as a display panel for 3rd party API calls (like a Twitch recent follower list). An EBS is unnecessary in such cases because an existing service can perform all the work necessary to generate content. Many popular utility extensions are “display only”.

    \n\n

    Verifying the JWT

    \n\n

    Your EBS needs to verify the communication it receives via any AJAX call from your extension. For example, it may need to enforce a policy that certain configuration tasks can be performed only by broadcasters. It also may want to ensure that a confirmed Twitch viewer, as opposed to an unidentified agent, is connecting to the EBS. As described above, the front-end iframe can obtain a signed JWT via the Extension Helper, using the onAuthorized() callback. The extension developer may then include this token as a header when making AJAX calls to the EBS.

    \n\n

    JWT signing and validation libraries are available for many languages at JWT. They usually follow a calling interface similar to this:

    \n\n
    verify(<jwt>, <secret>)\n
    \n\n

    Where:

    \n\n
      \n
    • \n<jwt> is the token received from the Twitch backend via the Extension Helper and passed as a header to the EBS.
    • \n
    • \n<secret> is the previously established shared secret. For more information about secrets, see the next section (Signing the JWT).
    • \n
    \n\n

    The JWTs used by Twitch Extensions expire, and verification of them fails after the expiration date. The Extension Helper automatically refreshes the token and then re-calls the onAuthorized() callback. Always use the latest JWT supplied by the Extension Helper.

    \n\n

    For the full JWT schema and detailed notes on each field, see the “JWT Schema” section of the Extensions Reference.

    \n\n

    Signing the JWT

    \n\n

    In addition to verifying tokens signed by the Extension Helper, your EBS needs to be able to sign new JWTs for calls to various Extensions endpoints that use JWT as the authentication mechanism. Use the following format for the payload object in a JWT signed by your EBS:

    \n\n
    {\n  \"exp\": 1502646259,\n  \"user_id\": \"27419011\",\n  \"role\": \"external\"\n}\n
    \n\n

    Where:

    \n\n
      \n
    • \nexp is the Unix epoch timestamp when the payload will expire. Be sure to provide a buffer, to allow potential positive time drift.
    • \n
    • \nuser_id is the Twitch user ID that owns the extension.
    • \n
    • \nrole is set to external.
    • \n
    \n\n

    For more information about these fields, see the “JWT Schema” section of the the Extensions Reference.

    \n\n

    Sign the payload using your JWT library, which usually has a calling interface similar to this:

    \n\n
    sign(<payload>, <secret>)\n
    \n\n

    Where:

    \n\n
      \n
    • \n<payload> is the token object created in the previous step.
    • \n
    • \n<secret> is the previously established shared secret.
    • \n
    \n\n

    Note: If the call fails, consult the documentation for your software library for the details on formatting the call.

    \n\n

    Finally, send your signed JWT in the request header, following this format:

    \n\n
    Authorization: Bearer <signed JWT>\n
    \n\n

    Broadcasting via PubSub

    \n\n

    When the EBS wants to transmit real-time messages or state via PubSub, it will use the Send Extension PubSub Message endpoint. Using this endpoint, your EBS can broadcast to all viewers of a given channel or to specific users via a whisper.

    \n\n

    Adhere to these limits for Twitch PubSub traffic:

    \n\n
      \n
    • 1 message per second per channel
    • \n
    • 5 KB message size
    • \n
    \n\n

    These rules ensure the stability and scalability of our systems.

    \n\n

    Required Configurations

    \n\n

    If you specify configuration information in your EBS, you can optionally require that a broadcaster successfully configures your extension before activation is allowed. This can be useful if, for example, an active extension would show a confusing error message to all viewers if misconfigured. You enforce required broadcaster configuration with a string in the Required Configurations field. The contents of this string can be whatever you want. By using the string you provide in this field, you can easily require different configurations from version to version, so that if a new version requires reconfiguration, the broadcaster will need to complete configuration before activating the new version.

    \n\n

    Once your EBS determines that the extension is correctly configured on a channel, call the Set Extension Required Configuration endpoint.

    \n\n

    Using the Configuration Service

    \n\n

    The configuration service enables you to store persistent per-channel and per-extension data and have it provided to your front end on extension startup. This is a common need for most extensions. With the configuration service, you can quickly support scenarios like:

    \n\n
      \n
    • Enabling broadcasters to customize your extension.
    • \n
    • Storing user IDs to call third-party APIs from your EBS. Note that this information becomes public when it is stored. All data is sent to extension views by anonymous users, so no authentication is required to retrieve it.
    • \n
    • Saving extension-wide settings.
    • \n
    \n\n

    More importantly, with the configuration service, you do not need to expose your EBS to the extension front end on initial load, eliminating the need for your EBS to scale to support that scenario. In some cases, you can build an extension without an EBS, just by using the configuration service. (You can still build this functionality in your EBS, if you choose.)

    \n\n

    You choose whether to use the configuration service in the capabilities section of extension management on the developer site. To make your choice, select one of the options (“No configuration”, “Custom/My Own Service”, or “Extension Configuration Service”) on the radio control on that page. Note that the page also controls whether the extension opts into other features such as identity linking and chat injection.

    \n\n

    After making your choice, data that is set via either Set Extension Configuration Segment or the set helper function (see Helper: Configuration) will be provided to the extension during bootstrap. 

    \n\n

    An extension configuration has three types of configuration segments:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Segment TypeIs delivered to ...Can be set by ...
    DeveloperViews of your extension on the associated channel.Developers 
    BroadcasterViews of your extension on the associated channel.Developers and broadcasters
    GlobalEvery view of your extension, regardless of the channel.Developers 
    \n\n

    For Extension examples that leverage the configuration service see the Twitch Extensions API Reference. Also, see these repositories:

    \n\n\n\n

    Setting Required Configuration with the Configuration Service (Optional)

    \n\n

    Extensions can choose to use the configuration service and then make a second choice to display without configuration:

    \n\n
      \n
    • If you don’t require configuration, the assumption is that your extension code assumes default values until it is configured. This case is useful if you want to use the configuration service to track broadcaster preferences instead of required settings.
    • \n
    • If you do require configuration, the extension won’t render until the broadcaster has configured it. In this case, you must specify versions of the broadcaster and developer configuration segments in two places. First, set the required versions on the Extensions manager Capabilities tab. Second, on the extension side, set versions when you set configuration (via the helper method or the API). Note that these two settings are compared when the channel is loaded. If they do not match, the extension will not load.
    • \n
    \n\n

    Managing Extension Secrets

    \n\n

    Each extension maintains a shared secret that is used to sign and verify JSON Web Tokens (JWT) that provide the identity of users. Use this authentication method when making Extensions API calls from your EBS (for endpoints that support it).

    \n\n

    Twitch extension technology relies on a secret shared between the Twitch API and the EBS, to validate JWTs. This secret has an extremely long life (100 years); however, we strongly recommend that extension developers rotate the shared secret often, to better ensure its security.

    \n\n

    JWT Roles

    \n\n

    Both the EBS and Twitch create JWTs.

    \n\n

    The EBS should create and sign JWTs with the external role to perform API actions. Twitch creates JWTs with other roles, so the EBS can perform user authentication. Both use cases (the external role and other roles) use the same secret. (For a discussion of roles, see the “JWT Schema” section of the Extensions Reference.)

    \n\n

    Creating Secrets

    \n\n

    To create a new secret:

    \n\n
      \n
    1. Go to the Settings page of your extension in the Extensions console.
    2. \n
    3. On the left panel, click Secret Keys.
    4. \n
    5. Click Create New Secret to generate a new secret key. You will see the following:\n
        \n
      • \nKey — The secret, base64 encoded.
      • \n
      • \nActive — UTC timestamp when the secret becomes active. This allows the secret to propagate through both Twitch servers and the EBS, before you use it.
      • \n
      • \nExpires — Timestamp when the secret expires. This is the latest time to use this secret to verify a JWT; the JWT should be discarded after this time.    
      • \n
      \n
    6. \n
    \n\n

    Optionally, you can create new secrets with the Create Extension Secret endpoint. 

    \n\n

    Note: Each time a new secret is requested, the old one is updated to expire after one hour (enough time for Twitch clients to rotate over to the new secret smoothly).

    \n\n

    Rotating Secrets

    \n\n

    To keep your secrets from becoming useless, you must rotate them before they expire. To do so, create a new secret on the extension’s Settings page under Secret Keys. The table will update, showing when the previous key will expire and the new key will be active.

    \n\n

    Because of the activation delay, you can have multiple secrets active for some (configurable) period of time. For signing, use the active secret with the latest expiration time.

    \n\n

    Note: This option is for emergency situations where a secret has been compromised and breaking the extension is preferable to waiting for the secret to cycle.

    \n\n

    For a higher level of security, you can rotate secrets programmatically on a scheduled basis. For more information, see the Extensions Reference

    \n\n

    Revoking Secrets

    \n\n

    At any time, if your secrets are compromised, you can use the Revoke All Secrets option on the extension’s Settings page under Secret Keys. View this as a kill switch: it immediately deletes all secrets associated with a specified extension.

    \n\n

    Optionally, you can revoke all secrets through the Revoke Extension Secrets endpoint.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","designing":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    General Guidelines 
    \n\t\t\n\t\t\t
    Panel Extension Guidelines
    \n\t\t\n\t\t\t
    Video-Overlay Extensions
    \n\t\t\n\t\t\t
    Mobile Guidelines
    \n\t\t\n\t\t\t
    Pop Out
    \n\t\t\n\t\n\n\n\t\t

    Designing Extensions

    \n\n

    Introduction

    \n\n

    If you are just getting started with Extensions, use the recommendations in this guide to put your best foot forward for streamers. If you already shipped an extension, use this guide to take your extension to the next level; e.g., with other extension types, such as panel or video overlay.

    \n\n

    General Guidelines 

    \n\n

    Extensions provide new ways to interact on Twitch, so we provide guidelines to help ensure your experiences are harmonious with the overall Twitch experience. 

    \n\n

    The guidelines in this section apply to all extension types. Guidelines for specific extension types appear in Panel Extension Guidelines, Video Overlay Extension Guidelines, Mobile Guidelines, and Pop Out Guidelines.

    \n\n

    Terminology

    \n\n

    The following table contains terms you will need to understand when you’re designing an extension. All the terms are specified in the Extensions Manager.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Term Guidelines
    The extension’s Name is how you define what streamers know it as. The name can show up in many places, such as the Extensions manager and the details page.Use a descriptive name that allows streamers to understand what your extension does at a glance.

    Don’t change the name, unless the nature of the extension has changed significantly. 

    Don’t use words unrelated to your extension just to boost your extension in search results.
    The Summary is a short description of your extension that streamers see when hovering over the discovery splash screen in the Extensions manager. The right summary helps them decide to install the extension.Use as a selling point the most important benefit to a streamer using your extension.

    Be concise. Don’t try to explain everything your extension does in the summary.
    The Description is a longer explanation of your extension. It appears on the details page.Write the description from your streamer’s viewpoint. Let streamers know how your extension will improve and enhance their channels.

    Consider writing in the second person (using you/your), to more closely associate with streamers.

    Don’t be too verbose.
    The Discovery Image is the first thing streamers see of your extension. The Extensions manager shows this splash screen in the Discovery tab on a broadcaster’s dashboard.Don’t use a lot of text; that overwhelms the image.

    Avoid having too much detail in the image, to maximize visibility.

    Avoid transparency in your PNG.
    \nScreenshot Images are your best tool to help streamers understand how your extension works, if they haven’t seen it on someone’s channel.Provide clear images that display how your extension works.
    You are required to choose a General Category for your extension.If your extension fits in more than one category, choose the most appropriate one.

    Don’t choose a category that your extension clearly does not match - for example, specifying the “Schedule and Countdowns” category for a Destiny 2 gear extension.
    If your extension supports specific games, you can indicate which ones under Game Category.List only those games your extension supports.
    \n\n

    Introduce Your Extension to Streamers

    \n\n

    The Twitch Extensions directory showcases all Extensions available to broadcasters, letting them see examples of each extension as it would appear on their channels as a panel, video overlay, or video component.

    \n\n

    \"Discovery

    \n\n

    Simplify Onboarding and First-time Use

    \n\n

    Once the extension is configured and installed, simplify onboarding for viewers to increase their engagement. For video-based Extensions, a subtle animation can be used to draw the viewer’s eye to engage with your experience. For panel Extensions, consider a splash screen explaining the extension’s capability (unless it is an informational extension, such as one that dynamically displays the top cheerers on a stream).

    \n\n

    Extensions should not be distracting (remember the <blink> tag?), but it is appropriate to provide small clues; e.g., subtle bounces to indicate interactivity, and brief flashes to indicate state changes. A distracting extension focuses the viewer’s attention on your extension, away from the broadcast. This paradigm is still new and might require a little training of Twitch viewers.

    \n\n

    If your extension requires some setup by viewers, consider disclosing those steps progressively throughout the experience: ask for only the information you need to get to the next step, rather than all the information up front. This includes asking for authorization from a viewer to share the viewer’s user name with the extension. Ask the viewer to authorize only when the extension requires the user name to continue. Also, it helps to explain to the user the value of the extension and why the extension requires user names, before asking for authorization.

    \n\n

    Amplify Broadcasters

    \n\n

    First and foremost, fans come to Twitch to engage with broadcasters. If broadcasters find that an extension will help grow their channels, they are more likely to install it. Some Extensions may provide utilities that are widely applicable to many broadcasters; e.g. leaderboards and top viewers. Other Extensions, like those made for a specific game, will have smaller audiences; that’s okay! Regardless, serving broadcasters first increases the likelihood of your extension being a part of their channel’s experience.

    \n\n

    Panel extensions have the unique capability to be always on, regardless of whether the streamer is online. We provide a JavaScript helper function that lets you see if a broadcaster is online, which you can use to change the experience of your extension. For example, a panel extension showing a leaderboard of viewer engagement could filter by the users attending the broadcast, versus overall top engagement when the streamer is offline.

    \n\n

    Complement the Stream UI

    \n\n

    The channel stream real estate may limit how your extension appears or is placed on the video. Top streamers often leverage broadcasting studio apps (like OBS) to create brand elements, animations, and live content to augment the broadcast. Given the shared space that Extensions occupy, assume that a streamer is leveraging tools like OBS to create a canvas that may interfere with the area where your extension UI will appear. Following this assumption, Extensions should include configuration options for broadcasters to align the experience with their channel’s branding. Consider allowing color, font and other UI customizations, to ensure your extension blends in with the overall experience.

    \n\n

    Consider including extension capabilities that can be minimized or hidden by users, and only take up areas of the real estate that make sense given the content a streamer broadcasts. For example, a Hearthstone stream has most of its action in the middle of the board, so occupying the top right of the video will ensure your extension does not interfere with the game’s content. However, if your extension augments the information about the game and may require placement closer to the content on video, make sure it can be collapsed, to ensure you limit its interference with the content/game.

    \n\n

    Fail Gracefully and Take Feedback Well

    \n\n

    With potentially hundreds of thousands of users interacting with your extension every day, there is a chance your extension will have issues. Even relatively simple Extensions (like those that display the gear a streamer uses to create a broadcast) can have hundreds of failure points. Just like any app, anticipating general failures helps build user trust.

    \n\n

    Apps should handle 404 or 500 errors by providing ways for viewers to provide feedback and leverage some other part of your extension. Apps that fail to retrieve data also should allow users to provide feedback. Streamers control the placement and use of extensions, so your extension should be prepared to accept feedback directly. If you don’t provide support, Twitch may find it necessary to remove your extension from the directory.

    \n\n

    Choose the Right Extension Type

    \n\n

    Throughout this guide, we provide guidelines for using different types of Extensions, but in general, consider:

    \n\n
      \n
    • Content — How does your extension expand stream content? Does it relate to a game, or does it integrate with other apps (like those that play music)? Content may also help you decide where to place an extension. For example, a panel may be the best way to display content related to your channel panel, whereas a video overlay may be best for content related to a specific game.
    • \n
    • Context — Does your extension depend on real-time interaction? Does it need the streamer’s help to attract attention? Answers to questions like these help determine whether to place your extension next to the stream or in a panel. 
    • \n
    \n\n

    UI Recommendations

    \n\n
      \n
    • \nBranding — Your extension’s branding should be clean, recognizable, and unique. In general, use your logo sparingly and use brand color to enhance your brand on Twitch. Your extension cannot include Twitch-branded elements, including the Twitch or Glitch logos.
    • \n
    • \nColor — Use a limited color palette. If your extension is for a specific game, use a complimentary color palette where appropriate. For a video-overlay extension, consider how it will blend into the content behind the extension (video, game data, or other stream-overlay components). Use a key color for emphasis and calls to action. Avoid using the same colors for interactive and noninteractive elements. We discourage the use of Twitch’s color palette, unless:\n
        \n
      • The extension includes buttons that invoke Twitch specific actions such as following a streamer or taking a clip.
      • \n
      • You are supporting light vs. dark mode for panel Extensions.
      • \n
      \n
    • \n
    • \nContrast and accessibility — Always provide enough contrast between colors, to ensure your designs are as accessible as possible. Avoid links on backgrounds that are of similar contrast. Consider your color-blind audience. We recommend you use this contrast checker tool.
    • \n
    • \nLayout — Use alignment and hierarchy for ease of visual scanning. Optimal layout depends on the type(s) of Extensions you make available for broadcasters;  see the sections below.
    • \n
    • \nTypography — Use font weight, size, and color for emphasis. If possible, try to use a single font; using multiple fonts can make your extension feel fragmented. Instead, use font styling (bold, italic) and a limited number of font sizes. Use built-in browser fonts: they perform best and and work on all browsers. Here are some Web-safe fonts:\n
        \n
      • Serif: Georgia, Palatino Linotype, Times New Roman
      • \n
      • Sans serif: Arial, Helvetica, Impact, Lucida Sans Unicode, Lucida Grande, Tahoma, Geneva, Trebuchet MS, Verdana
      • \n
      \n
    • \n
    • \nStateful feedback — Preload wherever possible.\n
        \n
      • Overlays: Preload is especially important for Overlays, but you should avoid the use of “loading” indicators, which can interfere with the viewing experience.
      • \n
      • Panels: If a panel extension needs to display a loading state, design the loading state to be as clear and concise as possible. Consider adding a loading indicator. Use status indicators to communicate updates, errors, and other issues; your audience should not have to guess what is going on.
      • \n
      \n
    • \n
    • \nNavigation —  In general, avoid multi-layered navigations. If you cannot, then provide a clear path to let users know where they are. Ask yourself if each navigation element is necessary.
    • \n
    \n\n

    Panel Extension Guidelines

    \n\n

    A panel extension appears in the panel area below the video player. Panel Extensions remain active even when the channel is not live.

    \n\n

    Follow these guidelines for Panels:

    \n\n
      \n
    • \nOnline/offline — Consider how panels work offline, as well as online. Panels can provide a continued reason for viewers to stay on a stream, even if the streamer is offline.
    • \n
    • \nUses beyond game content — Since panels do not reside on video content, they do not have to be as tightly coupled to the streamer’s content as other types of Extensions. Panels are great for displaying high-level stats about the stream, gear a streamer uses, or other enjoyable content that has no relationship to the content they stream. Panels also can be treated like a mobile web app, housing a game or productivity app..
    • \n
    • \nLayout — Panel Extensions are limited to 318px wide x 496px high, to avoid iframe scrolling. Within these limits, try to allow 10px of inner padding for any text within your extension, for maximum readability.
    • \n
    • \n

      Light vs. dark mode — Twitch allows users to switch between the default light theme and a dark theme. Responding to this preference ensures your extension does not stand out in a channel UI when users change their preferences. Below are example palettes we use for Twitch to support light and dark mode. You can listen for a user switching between light and dark mode using the onContextJavaScript helper function.

      If you want to support light and dark mode, we recommend the following background colors:

      \n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
      Attribute NameLight Mode Background ColorDark Mode Background Color
      Background ColorWhite #fffTwitch Dark Purple #201c2b
      Background Color - AccentTwitch Purple #6441A4Twitch Purple #6441A4
      \n\n


      Here are recommended text colors, when supporting light and dark mode:
       

      \n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
      Attribute NameLight Mode Text ColorDark Mode Text Color
      Default TextTwitch Dark Grey #232127Twitch Light Grey #e5e3e8
      LinksTwitch Purple #6441A4Twitch Light Purple #e2dbf0
      Text OverlaysTwitch Light Grey #e5e3e8Twitch Light Grey #e5e3e8
      \n
    • \n
    \n\n

    Video-Overlay Extensions

    \n\n

    Video-overlay Extensions are meant to enhance the viewer’s experience, so be aware that each extension element covers valuable real estate.

    \n\n
      \n
    • \n

      Sizing — When designing your extension UI, take into consideration that it needs to scale and adapt when the browser and video player resize. By default, a video-overlay extension functions at all sizes while the broadcaster is live. Consider hiding your extension when the size is reduced to a point that the extension becomes non-functional.

      \n
    • \n
    • \n

      Covering up player elements —  If you have extension UI elements over the Twitch video player, interactions with those elements may not work. Here is a diagram of areas to consider when you design your video-overlay extension - placing elements in the purple areas may cause conflicts with the video player UI:

      \n
    • \n
    \n\n

    \"Safe

    \n\n
      \n
    • \niFrame boundaries —  For drag-and-drop elements, consider how your video-overlay extension will respond when a user tries to move an element outside the video player’s viewing area. Design your extension to block elements from being relocated to outside the viewing area and/or force them to “spring” back into the viewing area.
    • \n
    • \n

      Disabling — A video-overlay extension disables itself when the broadcaster goes offline or hosts another channel. When a viewer pauses the video, the extension iframe is hidden until the viewer un-pauses the video.o.

      \n
    • \n
    • \nPlayer control layers — Keep in mind that your video-overlay extension will be rendered below all our video-player controls, such as pop-up menus, mouseovers, LIVE indicator, and channel information in the top left of popout/embed versions of the video player. Remember that theater mode, full screen, and embed have different UI layouts than the “normal” Twitch player.

      TBD graphic:
    • \n
    \n\n

    Mobile Guidelines

    \n\n

    When designing mobile Extensions, consider the basic principles of any mobile application:

    \n\n
      \n
    • \n

      Your layout should be fluid — Your extension’s layout should gracefully adapt to the available space. Do not assume any specific aspect ratio or dimensionn.

      \n
    • \n
    • \n

      Design for touch — Make sure interface elements that are actionable can be comfortably reached. Evaluate the tap target sizes and their relation to neighboring actionable elements. Consider a target size of no less than 44 pt/dp.

      \n
    • \n
    • \n

      Reduce noise —  Trying to pack all your Extensions’ capabilities in the limited real estate will overload users with too much information. Bring in only the essential components of the experience. Limit buttons, images, and text that will be in view. Disclose actions progressively and contextually.

      \n
    • \n
    • \n

      Navigation should be obvious — If you are incorporating sub-navigation in your Extensions, make it obvious, with common mobile navigation patterns and affordances. If you do implement a navigation, indicate to users where they are within the extension, to keep them grounded.

      \n
    • \n
    • \n

      Interface elements should be clear and visible —  Color and contrast are important in helping users understand the different elements of your extension. Take into account the visual hierarchy and proper spacing and text size for legibility.

      \n
    • \n
    \n\n

    For guidance, here are some examples.

    \n\n

    Optimized Extension Example

    \n\n

    \"Extension,

    \n\n

    Here are notes on the optimizations:

    \n\n

    \"Notes

    \n\n

    Alignment Example

    \n\n

    \"Mobile

    \n\n

    Phones (Landscape View)

    \n\n

    \"Phones,

    \n\n

    iPhone X (Aspect Ratio: 19:5:9)

    \n\n

    \"iPhone

    \n\n

    Pop Out

    \n\n

    To optimize the layout of pop-out Extensions, consider the following:

    \n\n
      \n
    • \nYour layout should be fluid — As with mobile design, your pop-out extension’s layout should gracefully adapt to the available space. Do not assume any specific aspect ratio or dimension.
    • \n
    • \nConsider opportunities to take advantage of additional real estate — When popped out, an extension initially is displayed in the native size shown on the original page. Since viewers can resize the new window as desired, extension developers with pop-out support may control more screen real estate than the original extension size..
    • \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","guidelines-and-policies":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    1 Functional
    \n\t\t\n\t\t\t
    2 Technical
    \n\t\t\n\t\t\t
    3 Mobile
    \n\t\t\n\t\t\t
    4 Content Policy
    \n\t\t\n\t\t\t
    5 Commerce
    \n\t\t\n\t\t\t
    6 Bits in Extensions
    \n\t\t\n\t\t\t
    7 Moderation
    \n\t\t\n\t\n\n\n\t\t

    Extensions Guidelines and Policies

    \n\n

    Introduction

    \n\n

    Extension developers must abide by the rules below and the Twitch Developer Services Agreement, Terms of Service, and Community Guidelines. Extensions that are not in compliance will not be approved. Twitch reserves the right to remove any Extension, for any reason, at any time.

    \n\n

    1 Functional

    \n\n

    1.1  All submitted review channels must be live during the time of review.

    \n\n

    1.2  Extensions must load when activated on a review channel.

    \n\n

    1.3  Extension functionality must be intuitive to use if sufficient testing instructions are not included.

    \n\n

    1.4  Extensions that require a third-party environment or game to be active during review must have that environment or game set up on the review channel.

    \n\n

    1.5  Extensions must be able to be configured within the review channel dashboard without error.

    \n\n

    2 Technical

    \n\n

    2.1  Extensions may not use Flash.

    \n\n

    2.2  Extensions may not use iframes.

    \n\n

    2.3  Extensions may not use keyboard shortcuts to power functionality.

    \n\n

    2.4  Extensions can include audio only if they include controls which allow viewers to adjust the volume, and by default, these controls are set to off/muted.

    \n\n

    2.5  JavaScript files submitted for review must be human-readable. If you submit minified or obfuscated JavaScript files that are not human-readable, you will be contacted with further instructions on how to submit human-readable code for the team to review.

    \n\n

    2.6  For Extensions that rely on libraries that are not human-readable or that use eval(), you must not combine those libraries into any minified or obfuscated JavaScript files submitted for review. Instead, you must source these libraries separately so that reviewers may know the source of any obfuscation or eval() statements.

    \n\n

    2.7  You must not inject directly into the DOM any data obtained dynamically over AJAX without first validating and processing that data.

    \n\n

    2.8  All front-end HTML, CSS, and Javascript files used by your Extension must be included in the zip file for your assets. You should not include extraneous files or code not used by your extension.

    \n\n

    2.9  The Twitch Extension Helper must be included in all front-end HTML files.

    \n\n

    2.10 Extensions with component displays may not duplicate any of the functionality that is provided by the component frame UI (e.g., minimize/close window, title bar display, etc).

    \n\n

    2.11 Extensions must utilize the entire size of the request iframe for component displays.

    \n\n

    3 Mobile

    \n\n

    These policies apply to Extensions that are mobile enabled:

    \n\n

    3.1  Mobile Extensions must support iOS 10+ and/or Android 4.1+ (Level 16).

    \n\n

    3.2  Mobile Extension initial page load from the Twitch CDN should not exceed 1MB.

    \n\n

    3.3  Mobile Extensions should load in less than 3 seconds at ~500 Kb/s.

    \n\n

    3.4  Mobile Extensions must display all elements within the stream chat viewport in both portrait and landscape views.

    \n\n

    4 Content Policy

    \n\n

    4.1  Extensions must have an icon and at least one screenshot that accurately represent the Extension front end.

    \n\n

    4.2  Extension descriptions must accurately and completely describe the Extension’s functionality. If the Extension has chat capabilities enabled, the description must include how the Extension interacts with the chat.

    \n\n

    4.3  Extensions may not use the Twitch name, Twitch branding, the Twitch logo, Twitch global emotes, or the Twitch Glitch in their Extension content.

    \n\n

    4.4  Extensions may not display any advertising or sponsorship content (static or dynamic).

    \n\n

    4.5  Encouraging or rewarding users for taking specific actions outside Twitch/Amazon properties must not be a principal use case of the Extension.

    \n\n

    4.6  Off-site linking:

    \n\n

          4.6.1  Off-site links may not refer users to sites that deliver functionality effectively similar to that available on Twitch.tv.

    \n\n

          4.6.2  Off-site linking elements must have a visible indicator to signify that it will take the user off-site, such as link text, or a button.

    \n\n

         4.6.3 Off-site links may not refer users to sites where the main purpose is to buy products or services, unless the link is to Twitch or Amazon properties (except as allowed in 4.9).

    \n\n

    4.7  Extensions may require broadcasters to download third-party software in order to function.

    \n\n

    4.8  Extensions may not require viewers to download third-party software in order to function.

    \n\n

    4.9 Extensions may not include product branding unless (a) the Extension is whitelisted to a specific broadcaster and the brand shown is owned by the whitelisted broadcaster or (b) the branding merely identifies the Extension developer or the underlying technology enabling the Extension (i.e., “powered by X” with a corresponding link-off is allowed, but “powered by X and brought to you by Y” is not allowed).

    \n\n

    5 Commerce

    \n\n

    5.1  Extensions may provide differentiated experiences or functionality to broadcasters, in exchange for compensation from broadcasters. Examples: tiered access to features or purchasable plugins to add functionality.

    \n\n

    5.2  Extensions may not allow items to be exchanged for money or other commerce instruments. Items may be exchanged for loyalty-based points or Bits (in compliance with the Bits Acceptable Use Policy and the Bits-in-Extensions Policies).

    \n\n

    5.3  Awarding loot boxes that include an element of randomness is permitted so long as contents of the loot box do not have a monetary value (i.e., the loot box may not be purchased as a standalone item and the items are not sold elsewhere).

    \n\n

    5.4 Extensions may not utilize commerce instruments for donations to charities.

    \n\n

    6 Bits in Extensions

    \n\n

    Use of Bits on Twitch is governed by the Bits Acceptable Use Policy and the following policies:

    \n\n

    6.1  Bits may be used within your Extension:

    \n\n

          6.1.1  To activate an experience for the broadcaster and/or the community. For example, the community feeding a virtual pet with Bits that continues to grow; a digital popcorn machine teeters on the verge of exploding when the community uses Bits.

    \n\n

          6.1.2  To unlock a digital consumable experience on Twitch. For example, Bits are exchanged for a special avatar within an Extension game.

    \n\n

          6.1.3  To enrich or enhance gameplay in a free-to-play game. For example, Bits may be used to unlock otherwise unavailable levels of gameplay (i.e., unavailable due to timers, energy systems, or other throttling mechanics), gameplay lives, gameplay avatars or character attributes, gameplay speeds, and social features for interacting with others in the Twitch community.

    \n\n

          6.1.4  For voting activities in your Extension, such as allowing viewers to use Bits to show support for a desired outcome made available through a poll or voting mechanic.

    \n\n

    6.2  Bits may not be used within your Extension:

    \n\n

         6.2.1  To obtain access to a pay-to-play game.

    \n\n

         6.2.2  To allow an end user to use Bits to play a specific musical track or audio-visual work. (e.g., jukebox-like functionality).

    \n\n

         6.2.3  If your Extension contains gambling activities that provide a reward with a monetary value (e.g., a slot-machine game that allows winners to obtain a downloadable code to redeem a game).

    \n\n

         6.2.4  Where Bits can be exchanged for loot boxes with unknown items that are determined randomly or by chance.

    \n\n

         6.2.5  To provide the end user with an entry into a sweepstakes or contest, whether through a token or otherwise. For example, do not design a scenario in which a viewer can use Bits to obtain a gem that will allow the user to participate in a sweepstakes to win a free flight to the DOTA championships.

    \n\n

         6.2.6  For engaging in “wagering” or “betting,” on gameplay events, contests of chance, or other outcomes beyond the end user’s control, to win additional Items or rewards. For example, do not suggest that if a viewer spends Bits on the outcome of a Fortnite match, and the streamer prevails, any viewer that presented Bits will obtain game codes.

    \n\n

         6.2.7 If your Extension provides VOIP-related functionality.

    \n\n

         6.2.8 Where Bits can be exchanged for items or experiences specified by broadcasters or end users, rather than specified by the Extension itself (e.g., utilizing a blank free-form text field, rather than a pre-populated drop-down menu).

    \n\n

    6.3  You may establish the amount of Bits necessary for the exchange of permitted items or experiences in your Extension. Twitch reserves the right to require adjustments.

    \n\n

    6.4  You may not describe the use of Bits in Extensions as “cheering,” which is a different Twitch feature.

    \n\n

    6.5  You may not describe the use of Bits in Extensions as a “donation” or ”support” in the financial sense for the broadcaster, “money transmission,” “purchase,” “spend,” “buy,” “insert” (such as likening Bits to quarters), or other similar description.

    \n\n

    6.6  Twitch may request changes to marketing, UX, and press releases about your extensions if they do not describe Bits in a manner consistent with our policies and T&Cs.

    \n\n

    7 Moderation

    \n\n

    The following policies apply to Extensions that allow “user content”, meaning any content that can be submitted or published to an Extension by an end user, including text, images, musical tracks and audio-visual works. “Submit” means the user content sent through the Extension has not been reviewed by the broadcaster. “Publish” means the user content sent through the Extension was approved and is immediately viewable on the channel. Extensions may utilize Twitch’s Moderation API to comply with these policies.

    \n\n

    7.1 Extensions may not allow end users to submit or publish user content unless the end user has granted the Extension access to their Twitch ID.

    \n\n

    7.2 Extensions must provide broadcasters with the ability to review, and reject or approve any image or other audio-visual user content that has been submitted through an Extension on their channel. 

    \n\n

    7.3 Extensions must clearly display the Twitch username of the user who submitted or published the user content.

    \n\n

    7.4 Extensions must provide broadcasters with the ability to remove any user content published through an Extension on their channel.

    \n\n
    \n

    Policy 7.5 As of November 9, 2020, banned users can no longer view Extensions. This policy and notice will be removed on February 12, 2021.

    \n
    \n\n

    7.5 Extensions must prevent users who have been banned or timed out from using chat in a channel from submitting or publishing user content through an Extension on that channel.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","increasing-feedback":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Chat In Extensions
    \n\t\t\n\t\t\t
    Best Practices
    \n\t\t\n\t\t\t
    Animations via Browser Source
    \n\t\t\n\t\n\n\n\t\t

    Increase Feedback in Extensions

    \n\n

    Introduction

    \n\n

    After you create a monetized extension, we recommend that you create a feedback loop that enables broadcasters to recognize viewer participation. After all, getting a callout from a streamer is a big reason why viewers subscribe to a stream or cheer with Bits on a stream.

    \n\n

    All of our top monetized extensions incorporate two types of feedback for that purpose: Chat in Extensions and Animations via Browser Source.

    \n\n

    Chat In Extensions

    \n\n

    Whenever a special action is completed in an extension, you can post to chat to acknowledge the user and draw more attention to the extension. 

    \n\n

    Implementation

    \n\n

    First, you need to enable your extension to send chat messages in the Extension Manager, under the Extension Capabilities of your extension’s version. If you do not enable this setting, the request to send a message to chat will result in a 401 error.

    \n\n

    To authorize the request, you will need either a backend that can generate a JWT token or the JWT generated by Twitch with the broadcaster role. For details about signing the JWT, see Signing the JWT. With the proper JWT set in the Authorization header, send a request as detailed in the Extensions Reference for Send Extension Chat Message. The message will appear in chat with the extension’s name as the user. 

    \n\n

    Best Practices

    \n\n
      \n
    • The message rate limit is 12 messages per minute. Exceeding the limit will cause a 429 error.
    • \n
    • Consider the broadcasters and viewers: since other extensions may also be posting to chat, you should post to it only for major events, such as a sale.
    • \n
    • You can use emotes to make the messages more eye-catching. You can use any emote that the destination channel is subscribed to.
    • \n
    • Remember that your extension’s name will be displayed as its username in chat. If you find that your extension’s name is too long for chat, you can change the name (you need not create a new extension). You can do this in the Extensions Manager, under Settings for your extension.
    • \n
    • You cannot @mention another user in chat.
    • \n
    \n\n

    Animations via Browser Source

    \n\n

    You can increase your feedback loop by adding a special animation (custom message or unique graphic) when a user interacts with your extension. To display this on the stream and to have it reflected in the VOD, the broadcaster must implement your animation as a browser source.

    \n\n

    Implementation

    \n\n

    Browser sources are implemented on the broadcaster’s software, not on Twitch. This is achieved by loading, on top of the video source, a webpage that plays the animations when prompted.

    \n\n

    You must give the broadcaster a link to the webpage you are using for the notifications. The broadcaster must then add this link as a browser source in the streaming software. Any message pushed to that endpoint will be reflected in the broadcaster’s stream.

    \n\n

    Browser sources are supported on major broadcasting software such as OBS, OBS.Live, Streamlabs OBS, Xsplit, and Player.me. Xsplit and Player.me refer to a browser source as a Webpage.

    \n\n

    Best Practices

    \n\n
      \n
    • The URL should be uniquely identifiable. A very simple way to ensure this is to use the broadcaster’s Twitch user ID as a unique key - for example, for a user with Twitch ID 1234567: https://my.website.com/extension/1234567.
      For further information about translating a Twitch username to a Twitch ID, see the Twitch API Reference
    • \n
    • The custom URL should be displayed to the broadcaster in the config page of the extension. The broadcaster should be able to locate the URL at any time, in case they lose it after initially configuring the extension.
    • \n
    • Use extra security if the source contains private information. For example, if the user can input private information that can be displayed on stream, add an additional layer of security by generating a unique hash that identifies the user. This would make it hard for the broadcaster’s notifications to be spied on, since a viewer wouldn’t be able to easily guess the URL.
    • \n
    • If there is no alert, the webpage should not display any UI. This page will be active on the broadcaster’s stream, so do not add advertisements or un-triggered callouts.
    • \n
    • If you have a large animation to display, provide recommended window sizes to the broadcaster in the config page where they retrieve the browser source URL.
    • \n
    • Provide a way for the broadcaster to test the alert from either the config panel or live config panel. 
    • \n
    • Any further customization such as size, color, or duration are optional, but appreciated.
    • \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","life-cycle":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Local Test
    \n\t\t\n\t\t\t
    Twitch CDN & Hosted Test
    \n\t\t\n\t\t\t
    Review
    \n\t\t\n\t\t\t
    Post Review: Pending, Rejected, or Approved
    \n\t\t\n\t\t\t
    Released
    \n\t\t\n\t\t\t
    Moving from Local Test to Hosted Test
    \n\t\t\n\t\t\t
    Moving from Hosted Test to Review
    \n\t\t\n\t\t\t
    Updating after Release
    \n\t\t\n\t\t\t
    Deleting an Extension
    \n\t\t\n\t\t\t
    Pre-Release Disclosures
    \n\t\t\n\t\t\t
    Extensions Manager Overview
    \n\t\t\n\t\n\n\n\t\t

    Extensions Life Cycle Management

    \n\n

    Local Test

    \n\n

    Every version of every Extension begins in Local Test. All assets such as HTML, JavaScript, CSS, images, and fonts are served from the testing base URI that is defined on the Asset Hosting tab of the Extensions Manager. To locally test your Extension, you need a local Web server. Since some operations require HTTPS, you need to create and install a self-signed certificate on your system.

    \n\n

    In Local Test, you can install your Extension on your own channel, in the Extension Manager section of the streamer dashboard. If you are directed to configure the Extension, see Required Configurations. Click Activate. Then you can test your Extension.

    \n\n

    Twitch CDN & Hosted Test

    \n\n

    When you’re satisfied with the locally-hosted test version, upload your Extension’s assets to and begin serving them from the Twitch CDN. Then you can transition the version to Hosted Test, to test that the Extension still works when served from Twitch.

    \n\n

    If you are in Hosted Test and want to change any of your Extension version details, you must move back to Local Test.

    \n\n

    In both Local Test and Hosted Test, Extensions are visible only to a developer-provided list of test accounts and a small subset of Twitch staff. Other viewers see your channel without any Extensions.

    \n\n

    Review

    \n\n

    Once you complete the hosted test, you can submit the version for Review. While in review, all test accounts can continue to test the Extension as before. 

    \n\n

    Only one version of an Extension can be in Review at a time. Once a version is in Review, the only way to change it is to go back to Local Test, make changes, upload the assets again, then re-submit the version for review. Bear in mind that re-submitting resets your place in the review queue.

    \n\n

    Post Review: Pending, Rejected, or Approved

    \n\n

    After an Extension version is reviewed by Twitch, it is placed into one of three states:

    \n\n
      \n
    • \nPending Action means revisions are required. You are contacted at the email address you provided and told any the reason the Extension was not approved. You can then take the extension back to a test state, iterate on the issues, and re-submit for review. You do not need to create a new version.
    • \n
    • \nRejected means Twitch views the Extension as inappropriate and will not accept it. The Extension’s Client ID, which is a unique identifier, is permanently revoked. Rejected is a terminal state.
    • \n
    • \nApproved means you can release your Extension at any time. You can go back to a test state if desired, but you will have to go through another full review cycle.
    • \n
    \n\n

    Released

    \n\n

    When a new version is Released, it goes live and can no longer be updated, only replaced with a new version. Only one version of an Extension can be released at a time: any prior released version is transitioned to Deprecated, and any installations of it are immediately upgraded. When you release a new version:

    \n\n
      \n
    • Be aware that some viewers or streamers may be using the old version at that very moment.
    • \n
    • Ensure your Extension Backend Service (EBS) can handle traffic from older versions that are not yet refreshed.
    • \n
    \n\n

    Moving from Local Test to Hosted Test

    \n\n

    In order to move an Extension from local test to hosted test, you need to enter the required fields listed in the following table.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Extensions Manager TabRequired FieldsOptional Fields
    Monetization
      \n
    • Bits Support (default: No)
    • \n
    • Subscription Support (default: No)
    • \n
    N/A
    Files
    • Version Assets
    N/A
    AccessN/A
      \n
    • Streamer Allowlist
    • \n
    • Testing Account Allowlist
    • \n
    \n\n

    Moving from Hosted Test to Review

    \n\n

    In order to move an Extension from hosted test to review, you need to enter the required fields listed in the following table.

    \n\n

    Note: While we require you to provide a review channel link, you are not required to have your review channel live while waiting for your review to be complete. Extensions that allow the broadcaster to successfully configure the Extension with no use of an external application or game data connection do not require a continuously-live review channel. Panel-only Extensions also do not require a continuously-live review channel. If your Extension requires a specific game environment or backend service to be live for it to function, please provide your availability for review times within 9AM - 5PM PT in the Walkthrough Guide and Change Log. We will reach out and request another review time if we find that your review channel is not live at the time of the review.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Extensions Manager TabRequired FieldsOptional Fields
    Status 
    (a pop-up screen appears when you submit for review)
    • Extension Review Channel URL
    • Walkthrough Guide and Change Log
    Version Details
      \n
    • Name
    • \n
    • Summary
    • \n
    • Description
    • \n
    • Author Name
    • \n
    • General Category
    • \n
    • Logo Image
    • \n
    • Taskbar Icon Image (video-component Extensions only)
    • \n
    • Discovery Image
    • \n
    • Screenshot Image
    • \n
    • Author Email
    • \n
    • EULA or Terms of Service URL
    • \n
    • Privacy Policy URL
    • \n
      \n
    • Game Category (required for  Extensions integrated with a game; otherwise, optional)
    • \n
    • Support Email
    • \n
    Capabilities
      \n
    • Request Identity Link
    • \n
    • Chat Capabilities
    • \n
    • Select how you will configure your Extension
    • \n
      \n
    • Developer Writable Channel Segment Configuration
    • \n
    • Streamer Writable Channel Segment Configuration
    • \n
    • Allowlist URLs
    • \n
    • Allowlisted Panel URLs
    • \n
    Asset Hosting
      \n
    • Testing Base URI
    • \n
    • Type of Extension
    • \n
    • Viewer Path
    • \n
    • Panel Height
    • \n
    • Video - Fullscreen View Path
    • \n
    • Config Path
    • \n
    • Live Config Path
    \n\n

    Updating after Release

    \n\n

    To update an Extension after it has been released, create a new version and submit it for review. This process does not affect the version of your Extension that is live. To create a new version, go to your Extensions developer console and do one of the following:

    \n\n
      \n
    • Click on the Extension to be updated, to open a page listing all versions of that Extension. Click Create New Version.
      The system copies all information from the prior version to the new one.
    • \n
    • Clone any previous version, to use as the basis for your new version.
    • \n
    \n\n

    Deleting an Extension

    \n\n

    If you decide to stop supporting your Extension, you can delete it. Deleting an Extension is not reversible, and you can’t delete specific versions of an Extension.

    \n\n

    To delete an Extension, go to the Extensions developer console, then:

    \n\n
      \n
    1. Find the Extension you want to delete.
    2. \n
    3. Click Extension Authorization Settings.
    4. \n
    5. Click Delete Extension.
      This will delete all installations and activations of all versions of the Extension.
    6. \n
    \n\n

    Pre-Release Disclosures

    \n\n

    Viewers will not be able to use an Extension until they agree to the Extension disclosures that are visible on your channel page. These disclosures are removed when viewers install a reviewed and approved Extension that is listed in the Extension Directory.

    \n\n

    Extensions Manager Overview

    \n\n

    Use the Extensions Manager to create new Extensions and make changes to existing Extensions:

    \n\n
      \n
    1. Open the Extensions Manager: In your Extensions console, select any version of any Extension and click Manage.
    2. \n
    3. On every page of the Extensions Manager, you see the state of your Extension and next steps to move through the Extension life cycle.
    4. \n
    5. Follow the instructions for the Extensions Manager tabs: Status, Version Details, Capabilities, Monetization, Files, Asset Hosting, and Access.
    6. \n
    \n\n

    Status

    \n\n

    The Status tab indicates where in the Extensions life cycle your Extension is and what steps you can take next. Depending on where your Extension is in the life cycle, different information and buttons appear on this page to indicate, for example, how to add information required before you can move to the next life-cycle stage.

    \n\n

    When you click to submit your Extension for review, you are prompted to enter the following information:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    UI ItemDescription
    Extension Review Channel URLURL of the Twitch channel where the Extensions review team will test your Extension.
    Walkthrough Guide and Change LogWith your first version, submit a clear, thorough guide that describes Extension functionality and how you expect viewers to use it. For subsequent versions, include a change log. Failure to provide these may result in delayed review or rejection.
    \n\n

    Version Details

    \n\n

    Most of the information on the Version Details tab is displayed in the Discovery tab on a streamer’s dashboard. For tips on using discovery to your best advantage, see Designing Extensions.

    \n\n

    There are three categories of fields to be entered: general settings, image assets, and miscellaneous other fields.

    \n\n

    General Settings

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Field Description
    NameYour Extension’s name.
    SummaryThis will be viewable by streamers and viewers. It should be 1-2 brief sentences describing what your Extension does. 
    DescriptionMore detail than the Summary about the functions of your Extension.
    Author NameThe full name of the Extension author or organization that will receive credit in the Extensions Manager.
    General Category\n

    If your Extension fits in more than one category, chose the most appropriate one. Don’t choose a category that your Extension clearly does not fit into. The drop-down list has these categories:

    \n
      \n
    • \nExtension for Games: Extensions that are built specifically to support games, either a specific game or many games.
    • \n
    • \nGames in Extensions: Extensions that contain games.
    • \n
    • \nSchedule and Countdowns: Extensions that allow broadcasters to communicate to their communities their next event or stream.
    • \n
    • \nPolling and Voting: Extensions that enable broadcasters to get viewer feedback.
    • \n
    • \nLoyalty and Recognition: Extensions that help viewers use loyalty points or provide a way for them to be recognized in the channel, such as a leaderboard.
    • \n
    • \nMusic: Extensions that enable broadcasters to show their current song or enable viewers to request songs from the broadcaster.
    • \n
    • \nViewer Engagement: Extensions that provide different ways for viewers to engage, and do not fall into another category
    • \n
    • \nStreamer Tools: Extensions that do not fall into another category.
    • \n
    \n
    Game Category\n

    If your Extension supports specific games, you can indicate which ones here. Select up to 15 games. Start typing and the field will list available options. List only those games your Extension supports.

    \n

    This field is required for Extensions integrated with a game.

    \n
    \n\n

    Image Assets 

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Field Description
    Logo ImageAdd a logo for your Extension. This must be a 100x100 PNG. Do not use Twitch or Glitch logos. If you do not have a logo, a default logo is assigned.
    Taskbar Icon Image(Video-component Extensions only) This icon appears at the bottom of the stream, indicating which Extension is active. This must be a 24x24 PNG.
    Discovery ImageThis splash screen is the first thing streamers see of your Extension. The Extensions Manager  shows this image in the Discovery tab on a streamer’s dashboard. This must be a 300x200 PNG. Tips:
      \n
    • Don’t use a lot of text; that overwhelms the image.
    • \n
    • To maximize visibility, avoid having too much detail in the image.
    • \n
    • Avoid transparency in your PNG.
    • \n
    \n
    Screenshot ImageScreenshots are your best tool to help streamers understand how your Extension works, if they haven’t seen it on someone’s channel. You must include one or more screenshots when you submit an Extension for review. Provide clear images that display your Extension in action. Images can be PNG, JPG, or GIF. The minimum (and recommended) image size is 1024x768. Images must have a 4:3 aspect ratio. Files must be less than 10MB.
    \n\n

    Other Fields

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Field Description
    Author EmailContact information for the Extension creator. This is used to contact the developer with information about the Extension’s lifecycle. Twitch will never reveal this email to anyone on the site.

    After you submit this information, you will get a verification email. Be sure to click on the link in the email. If you have not done this, you will not get email notifications about file-upload issues or Extension approval.
    Support EmailPublic contact information for support-related queries from streamers.
    EULA or Terms of Service URLReference URL for your End User License Agreement or Terms of Service.
    Privacy Policy URLReference URL for your privacy policy
    \n\n

    Capabilities 

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Miscellaneous FieldsDescription
    Request Identity LinkDefault: No.
    Select Yes if your Extension needs to know the viewer’s numeric Twitch ID. Once the viewer accepts your request to share his Twitch identity, the viewer’s numeric Twitch ID is provided in the Extension Helper’s onAuthorizedcallback function. For details about these callbacks and the JWT format, see the Extensions Reference.
    Chat CapabilitiesDefault: No.
    Select Yes only if your Extension calls Send Extension Chat Message. If you select this, be sure to include details of your Extension’s chat functionality in your Extension description.
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Configuration FieldsDescription
    Select how you will configure your Extension\n

    Default: Extensions Configuration Service. Select the source of the configuration for your Extension.

    \n

    No configuration: Choose this if your Extension has no need for per-channel customization.

    \n

    Custom/My Own Service: Your Extension Backend Service provides the configuration. If you choose this, you can have the option to specify another field:

    \n
    • \nRequired Per Channel Configuration: Use this to require that a streamer successfully configure your Extension before activation is allowed. This can be useful if, for example, an active Extension would show a confusing error message to all viewers if misconfigured. The contents of this string can be whatever you want. This is covered further in Creating Your Extension Backend Service (EBS).
    \n

    Extensions Configuration Service: Your Extension will use a Twitch-hosted configuration. For more information, see Configuration Service.

    \n
    Developer Writable Channel Segment Configuration, Streamer Writable Channel Segment ConfigurationThese fields provide additional required configuration information. Specify these only if Extensions Configuration Service is selected as your configuration method. See instructions on the UI.
    Allowlist Config URLs, Allowlisted Panel URLsIf your Extension is required to open an external URL for configuration or as a core functionality for the panel, list the URLs here. See information about off-site linking in Extensions Guidelines & Policies.
    \n\n

    Monetization

    \n\n

    Select how you will configure your Extension:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldDescription
    Will you monetize your Extension?Default: No Bits support.
    Indicates whether your Extension can accept Bits.
    Subscription StatusDefault: No subscription support. Indicates whether your Extension can get a viewer’s subscription status.
    \n\n

    Extension Monetization within Organizations

    \n\n

    Developers who wish to collaboratively build and manage Extensions can do so within an Organization. Monetization is handled by billing managers appointed by organization owners. For more information and to get started, see the Organizations Guide.

    \n\n

    Files

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldDescription
    Upload Version Assets
     
    Before you can transition your Extension to Hosted Test, you must upload your assets to the Twitch CDN. Version assets must be a .zip format. The ZIP file cannot contain executable formats or files other than assets required to run the Extension.

    Be sure to also update the Asset Hosting tab with the file paths specified in the ZIP directory, so we can properly serve your assets on twitch.tv.
    \n\n

    Asset Hosting

    \n\n

    Content Security Policy (CSP)

    \n\n

    When an Extension is being hosted on Twitch, you must adhere to certain content security policies:

    \n\n
      \n
    • You cannot run inline scripts without a nonce/hash.
    • \n
    • You cannot use iFrames within your Extension.
    • \n
    • You can use either HTTPS or WSS to connect to external sources such as an EBS.
    • \n
    • You cannot have fonts or scripts hosted outside of the Extension files except for Google Fonts and Google Analytics.
    • \n
    • Fonts can only be loaded as a local file or by using Google Fonts. If using a local font and Webpack, Webpack’s url-loader will convert fonts under a specified size to a base64 URI, which will violate the CSP. To resolve this, use file-loader instead.
    • \n
    \n\n

    CSP for Reference

    \n\n
    connect-src https: wss: https://www.google-analytics.com https://stats.g.doubleclick.net; default-src 'self' https://0btmbqa5tm2pyr0f59td8vk1unwxl6.ext-twitch.tv; block-all-mixed-content; img-src * data: blob:; media-src * data: blob:; frame-ancestors https://supervisor.ext-twitch.tv https://extension-files.twitch.tv https://*.twitch.tv https://*.twitch.tech https://localhost.twitch.tv:* https://localhost.twitch.tech:* http://localhost.rig.twitch.tv:*; font-src https://0btmbqa5tm2pyr0f59td8vk1unwxl6.ext-twitch.tv https://fonts.googleapis.com https://fonts.gstatic.com; style-src 'self' 'unsafe-inline' https://0btmbqa5tm2pyr0f59td8vk1unwxl6.ext-twitch.tv https://fonts.googleapis.com; script-src 'self' https://0btmbqa5tm2pyr0f59td8vk1unwxl6.ext-twitch.tv https://extension-files.twitch.tv https://www.google-analytics.com;\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldDescription
    Testing Base URIChange this to reflect the root URI for all assets related to this Extension version. The URI must end with a forward slash.

    The URI is completely up to you; it need not match the version in any way. During test, assets are served directly from this URI, so you can update your code without re-submitting anything.
    Type of ExtensionSelect one or more types: Panel, Video - Fullscreen, Video - Component, or mobile.
    Viewer PathPath to the HTML file that is shown to viewers on the channel page. There is a path box for each item selected under Type of Extension.
    Panel HeightDefault: 300.
    This appears only for panel Extensions. It is the panel height in pixels. The range is 100-500.
    Video - Fullscreen View PathThis appears only for video-overlay Extensions. It is the path to the HTML file shown to viewers on the channel page when the Extension is activated as a video overlay. This path should be relative to the Testing Base URI.
    Config PathPath to the HTML file that is shown to streamers while they are configuring the Extension but before activating it within the Extensions Manager. This page is displayed in an iframe with a dynamic width (up to 1100px) and a dynamic height. This should be a path relative to the testing base URI. It should be used for infrequent, install-time configuration.
    Live Config Path (Optional)Path to the HTML file that is shown to streamers in the Live module of the dashboard. It is used for streamer actions taken while the Extension is active, such as creating a new poll. It should be a path relative to the testing base URI.

    If the live configuration view is specified or set, it will be enabled for pop-out control.
    \n\n

    Access

    \n\n

    The fields on the Access tab require comma-separated lists of account IDs, not names. To convert account names to account IDs, see Translating from User Names to User IDs

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldsDescription
    Streamer AllowlistAccount IDs in this list are the only Twitch streamers who can install this Extension after release using the Invite Only tab on the streamer’s Extensions Manager. If this field is blank, any Twitch user can install this Extension using the Extension Discovery Directory.

    Be sure to check your allowlist before submitting your Extension for review. If your Extension has allowlisted streamers when you submit it for review, the approved Extension is visible only to those streamers. After review, changing the allowlist requires re-submitting your Extension for review.
    Testing Account AllowlistAccount IDs of streamers who will be able to install and activate the Extension on their channels and view the Extension on any channel where it is activated. By default, you can install, activate, and view this Extension on your channel

    Adding IDs here prevents streamers outside the allowlist from installing the Extension once it is approved. If this is list empty or missing, all streamers can use the Extension. Accounts on the Testing Account Allowlist can install the Extension even if they are not on the Streamer Allowlist.
    \n\n


     

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","load-testing-extensions":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Prerequisites
    \n\t\t\n\t\t\t
    Setting up EBS testing on AWS
    \n\t\t\n\t\n\n\n\t\t

    Load Testing Extensions Using Locust and Elastic Beanstalk 

    \n\n

    Extension developers often ask how to load test their EBS (Extensions Backend Service). In this guide, we discuss how to go about load testing using Locust and Elastic Beanstalk. We have edited this AWS guide to work specifically for extensions backend testing.

    \n\n

    Prerequisites

    \n\n\n\n

    Setting up EBS testing on AWS

    \n\n

    There are three main aspects to setting up EBS testing on AWS.

    \n\n
      \n
    • Set up Locust
    • \n
    • Run your Locust test
    • \n
    • Scale your load tests
    • \n
    \n\n

    Set up Locust

    \n\n

    To set up Locust:

    \n\n
      \n
    1. Create a new t2 micro “Amazon Linux AMI 2018.03.0” instance and log into it.
    2. \n
    3. Install the Elastic Beanstalk CLI
      pip install awsebcli --upgrade --user\n
    4. \n
    5. \nConfigure your CLI:
      aws configure\n
    6. \n
    7. Install git in your t2 micro instance:
      sudo yum install git\n
    8. \n
    9. Clone the repository that contains the sample source code by running
      **git clone** **https://www.github.com/awslabs/eb-locustio-sample**\n
    10. \n
    11. In the AWS Identity and Access Management (IAM) console, create an IAM instance profile named aws-elasticbeanstalk-locust-role.
      For information on how to create an IAM instance profile, see Create an IAM Instance Profile for Your Amazon EC2 Instances.
    12. \n
    13. Add the following policy to your instance profile:
    14. \n
    \n
    {\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Sid\": \"VisualEditor0\",\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"elasticbeanstalk:DescribeEnvironmentResources\",\n                \"elasticbeanstalk:DescribeEnvironments\",\n                \"dynamodb:ListGlobalTables\",\n                \"dynamodb:ListTables\",\n                \"autoscaling:DescribeAutoScalingGroups\",\n                \"dynamodb:ListBackups\",\n                \"cloudformation:ListStackResources\"\n            ],\n            \"Resource\": \"*\"\n        },\n        {\n            \"Sid\": \"VisualEditor1\",\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"dynamodb:CreateTable\",\n                \"dynamodb:GetItem\",\n                \"dynamodb:UpdateItem\"\n            ],\n            \"Resource\": \"arn:aws:dynamodb:*:*:table/*\"\n        }\n    ]\n  }
    \n\n

    Once you have accomplished the previous steps, continue in the directory where you cloned the sample code. All the EB commands that follow must be run in this directory:

    \n\n
      \n
    1. Navigate to the directory eb-locustio-sample
    2. \n
    3. Initialize the directory for use with the EB CLI by running the following command: 
      eb init -r <region> -p \"Java 8\"
      Replace <region> with a region identifier such as us-west-2. For a full list of region identifiers, see Regions and Endpoints.
    4. \n
    \n\n

    Alternatively, start interactive mode by running eb init, then following this procedure: 

    \n\n
      \n
    1. Pick a region from the list.
    2. \n
    3. Choose Create New Application.
    4. \n
    5. Type a name for the application.
    6. \n
    7. When you are asked, “It appears you are using Python. Is this correct?” choose No.
    8. \n
    9. For platform, choose Java.
    10. \n
    11. For the platform version, choose Java 8.
    12. \n
    13. When you are asked, “Do you want to set up SSH for your instances?” choose No.
      Note: If you choose to enable SSH and do not already have an SSH key stored on AWS, the command ssh-keygen must be available on the path as it is used by the EB CLI to generate the SSH key to be used.
    14. \n
    15. Create your load generation environment by running the following command. Replace <Test URL> with the URL of the web app that you want to test.
      **eb create <env-name> -i c4.large --scale 1 --envvars TARGET_URL=<Test-URL> --instance_profile aws-elasticbeanstalk-locust-role** 
      Note: The scale CLI parameter shown previously here can be used to spin up more instances that can run as slaves to a master instance and provide higher throughput as needed for your testing needs. More details can be read in the “Scaling your Load Tests” section. 
    16. \n
    17. Type a name for the environment.
    18. \n
    19. Type the CNAME prefix that you want to use for this environment.
    20. \n
    \n\n

    After the environment has been created, the logs will indicate the URL for the application. It usually follows a format like CNAME.<region>.elasticbeanstalk.com.

    \n\n

    Run your Locust test

    \n\n

    Locust is a python script based framework for writing tests. If you would like to learn more about writing tests using Locust, see Writing a locustfile. The sample code you cloned previously includes a sample test definition that tests the root of the provided test URL every 45-50 milliseconds. We are now going to use a test definition better suited to testing your EBS. 

    \n\n
      \n
    1. Navigate to the folder where you cloned the sample code.
    2. \n
    3. \n

      Replace the [locustfile.py](https://github.com/awslabs/eb-locustio-sample/blob/master/locustfile.py) file with the following:

      \n\n
      import os\nimport string\nfrom locust import HttpLocust, TaskSet, task\nclass UserBehavior(TaskSet):\n    @task\n    def put_tests(self):\n        response = self.client.post(\"/<Your path here>\",\n        headers={\n#Your header values here\n        },\ndata={\n#Your POST data here\n})\nclass WebsiteUser(HttpLocust):\n    host = os.getenv(\n        'TARGET_URL', \"<DEFAULT URL HERE>\")\n    task_set = UserBehavior
      \n
    4. \n
    5. Save and commit the changes: git commit -am \"POSTing to my EBS\"\n
    6. \n
    7. Deploy your changes to the environment by running eb deploy --staged\n
    8. \n
    9. Once the environment update is complete, in a web browser, go to the URL you noted in Step 8 of the previous procedure.
    10. \n
    11. Run your test using the number of users and spawn rate as desired.
    12. \n
    \n\n

    Scale your load tests

    \n\n

    You can scale out your environment to more than one EC2 instance:

    \n\n
      \n
    1. Navigate to the folder where you cloned the sample code.
    2. \n
    3. Open the configuration file in the default editor by running eb config.
    4. \n
    5. Under the aws:elasticbeanstalk:command namespace, set the BatchSize to 100.
    6. \n
    7. Save the configuration file, and exit the editor to start the environment update.
    8. \n
    9. After the update completes, run eb scale <number of instances>. Replace <number of instances> with the number of EC2 instances that you want the environment to scale out to.
    10. \n
    11. After the additional instances have been added, run eb deploy --staged. Since Locust requires a single master, this step ensures that a single instance is selected as master after the environment has scaled out.
    12. \n
    13. To open the Locust dashboard and start your tests, in a web browser go to the URL you noted in Step 8 of the setup procedure.
    14. \n
    \n\n

     

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","monetization":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Enabling Monetization
    \n\t\t\n\t\t\t
    Configuring Monetization
    \n\t\t\n\t\t\t
    Managing the Bits Product Catalog
    \n\t\t\n\t\t\t
    Deleting, Deprecating, and Restoring a Bits Product
    \n\t\t\n\t\t\t
    Notes on Bits in Extensions
    \n\t\t\n\t\t\t
    For More Information
    \n\t\t\n\t\n\n\n\t\t

    Extensions Monetization Guide

    \n\n

    Introduction

    \n\n

    There are two ways to monetize an Extension:

    \n\n
      \n
    • \nBits in Extensions enables developers to offer viewers specific actions and products in exchange for a Bits. Once a broadcaster activates a Bits-enabled Extension on a stream, viewers can perform an action or purchase a product within the Extension, provided the viewer’s account contains enough Bits. If it does not, the Extension can help the viewer buy more Bits by taking the viewer to a separate, external system, that handles Bits purchases.
    • \n
    \n\n

    Revenue from Bits used in an Extension is shared between the broadcaster and the Extension developer.

    \n\n
      \n
    • \nSubscription status support allows an Extension to view a user’s subscription status (not subscribed, tier 1, tier 2, or tier 3) for the current channel. In this way, developers can tailor the features they offer to the viewer’s status.
    • \n
    \n\n

    Before you can monetize your Extension, you must enable and configure monetization, as described in the next two sections.

    \n\n

    Enabling Monetization

    \n\n

    Overview

    \n\n

    Enabling monetization (onboarding) allows you to create products to use in your Extension. During monetization onboarding, we require your tax and financial information, so we can validate your identity and pay out any revenue you earn.

    \n\n

    Notes:

    \n\n
      \n
    • Fill out the onboarding form carefully. To change information later, you must resubmit the form.
    • \n
    • This procedure is for Extensions developers, but it is done through your broadcaster dashboard rather than the developer console.
    • \n
    • Onboarding is only for developers who are not Twitch partners or affiliates. If you are a Twitch partner or affiliate, you do not need to onboard.
    • \n
    \n\n

    Process

    \n\n

    On the Monetization tab of the Extensions Manager, click Continue to Onboarding. Follow the steps on the page to go to the onboarding form. Be sure to complete all sections of the form.

    \n\n
      \n
    • \nRegister as a developer\n
        \n
      • Complete the fields with information about the legal entity that owns the extension. This information must exactly match your tax information and financial information, so make sure it is correct.
      • \n
      • Each legal entity can have only one Extensions developer account. If you have multiple individuals under one legal entity, please do not complete the onboarding multiple times; instead, have all your users utilize your onboarded Twitch account.
      • \n
      \n
    • \n
    • \nAgree to the Twitch Extensions Developer Agreement\n
        \n
      • If you are under 18, this section asks your parent or legal guardian to agree to the agreement on your behalf. Your parent or legal guardian must enter his/her full legal name, check the box, and click Agree.
      • \n
      • For help interpreting the contract, please contact your attorney.
      • \n
      \n
    • \n
    • \nComplete two tax interviews for royalty tax and service tax. The two forms are very similar but used for different purposes. Both need to be filled out accurately.\n
        \n
      • Since Twitch is a subsidiary of Amazon, we use some Amazon tools to help Extensions developers get registered, including the tax-information forms.
      • \n
      • For definitions of individual fields, see the Amazon Tax Information Interview Guide.
      • \n
      • For help with this section, please contact your tax professional.
      • \n
      \n
    • \n
    • \nProvide financial information to finish the process of validating your identity, enabling you to participate in available monetization features, and to choose a method of payment.\n
        \n
      • On the Payment Method screen, we recommend you select Hold My Payments. You can modify this selection later.
      • \n
      • Provide the requested personal financial information so we can validate your identity.
      • \n
      • This section may ask you for additional information. If you get this prompt, please submit a scanned copy of a government ID, such as a passport.
      • \n
      \n
    • \n
    \n\n

    After you provide all requested financial information, the approval process will begin. It can take up to two business days. If you are approved, you will receive a notification email. If not, information is provided in Extensions Monetization Developer Onboarding on your broadcaster dashboard. Check there if you don’t get approval email within two business days.

    \n\n

    Changing Information After Onboarding

    \n\n

    Changing onboarding information is done through your broadcaster dashboard, under Extensions Monetization Developer Onboarding.

    \n\n

    To change your payment method, select Change Payment Method.

    \n\n

    To change other information, on the Extensions Monetization Developer Onboarding main menu, click Start Over. This clears any information you have in our system, so you must complete the entire onboarding process again.

    \n\n

    Extension Monetization in Organizations

    \n\n

    For Extensions managed by an organization, you will need to follow a modified set of steps to enable Bits and Subscriptions features. To learn more, see Organizations.

    \n\n

    Configuring Monetization

    \n\n

    All broadcasters can install and activate Bits-enabled Extensions. However, Bits features will not succeed on channels that cannot accept Bits. We recommend that you build experiences that account for both eligible and ineligible channels.

    \n\n

    Overview

    \n\n

    Extensions that use Bits-in-Extensions features can be installed by all broadcasters, regardless of their ability to receive Bits on their channels. Check the twitch.ext.features.isBitsEnabled feature flag to determine if Bits-in-Extensions features will work in your Extension on the current channel.

    \n\n

    Note: It is mandatory to check for that flag for any monetized Extensions.

    \n\n

    This flag will be false if:

    \n\n
      \n
    • You did not enable Bits support in the Monetization tab in the Extensions manager.
    • \n
    • The broadcaster is not eligible to receive Bits.
    • \n
    • The broadcaster disabled Bits-in-Extensions features for your Extension.
    • \n
    \n\n

    If this flag is false, you should disable or hide the Bits-in-Extensions features in your Extension. We recommend that you build experiences that account for both eligible and ineligible channels.

    \n\n

    Process

    \n\n
      \n
    1. Go to the Extensions developer console: log in to the Twitch developer site with your Twitch ID, click Your Console (top right), then click the Extensions tab.
    2. \n
    3. Go to the Extensions manager: find the Extension/version you want to configure and click Manage.
    4. \n
    5. Click the Monetization tab.
    6. \n
    7. If you are a Twitch partner/affiliate, proceed to Step 5. If not, click Continue to Onboarding. The other fields on the page are not selectable until you complete onboarding. After you complete onboarding, proceed to Step 5.
    8. \n
    9. Select one or more monetization options:\n
        \n
      • Under Bits Support, select Bits enabled to enable your extension to offer Bits-enabled products.
      • \n
      • Under Subscription Support, select Subscriber support enabled to enable your Extension to get a viewer’s subscription status.
      • \n
      \n
    10. \n
    11. Manage the Bits Product Catalog (see next section). If you enable Bits, you can manage your product catalog inside the Extensions Developer Rig.
    12. \n
    \n\n

    Managing the Bits Product Catalog

    \n\n

    Introduction

    \n\n


    To manage your Bits products, you use the Bits Product Catalog. If your Extension is enabled for Bits monetization, then when you configure the Developer Rig to run with your Extension, you will see a Manage Products tab. Here, you can view, create, edit, and deprecate products as long as your Extension is enabled and configured for Bits and you are logged into the account that owns your Extension.

    \n\n

    If you try to redeem Bits for a product in an Extension which, on your own channel, is in a local or hosted testing state, it will succeed without using your Bits.

    \n\n

    Creating a Bits Product

    \n\n

    To create a Bits product and add it to the catalog:

    \n\n
      \n
    1. Click Add Product. This adds an unsaved new product to the list of your products. Refreshing the page will delete all unsaved changes.
    2. \n
    3. Set the catalog fields as desired. All fields are required.
    4. \n
    5. Click Save All, to save the new product to your catalog. Once you save a product, you cannot delete it or change its SKU.
    6. \n
    \n\n

    A catalog can contain at most 250 products. You can deprecate products.

    \n\n

    Editing a Bits Product

    \n\n

    To edit a product:

    \n\n
      \n
    1. Change fields as desired (see descriptions below). All fields are required. While you are editing, the purple dot on the right indicates a product was edited.
    2. \n
    3. Click Save All, to save all edited and new products.
    4. \n
    \n\n

    Deleting, Deprecating, and Restoring a Bits Product

    \n\n

    You cannot delete a product.

    \n\n

    You can deprecate a product, so it no longer shows up for end users. Deprecated products are not included in the products returned by getProducts.

    \n\n

    To deprecate a product:

    \n\n
      \n
    1. Click Deprecate next to the product.
    2. \n
    3. Click Save All.
    4. \n
    \n\n

    To restore a deprecated product:

    \n\n
      \n
    1. Click Restore next to the product.
    2. \n
    3. Click Save All.
    4. \n
    \n\n

    Bits Catalog Fields

    \n\n

    Here are the catalog fields:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Field NameDescription
    Product NameName of your product, to be displayed in your Extension. The maximum length is 255 characters.
    SKUSKU of your product. This must be unique across all your products. It cannot contain white space. The maximum length is 255 characters. The SKU cannot be changed after saving.\n
    Amount (in Bits)Number of Bits for which your product will be exchanged. Valid values: 1 - 10000.
    In DevelopmentToggles whether your product is “in development” and hence not included in the products returned by getProducts in production. Default: Yes.
    BroadcastToggles which Extension instances execute the onTransactionComplete callback. For more information, see the table near the end of If the Viewer is Logged In.
    \n\n

    Notes on Bits in Extensions

    \n\n

    Extension Initialization

    \n\n

    Normally, an Extension does bootstrapping or initialization operations in the onAuthorized callback. For Bits-in-Extensions purchases, getProducts also must be called to get Bits products.

    \n\n

    \"Bits

    \n\n

    Getting Bits-in-Extensions Products

    \n\n

    The number of Bits necessary to exchange for a product is a flat rate, regardless of the viewer’s geographical location. To display the amount to the viewer, the Extension helper for Bits-in-Extensions uses the getProducts function. You call getProducts as part of your Extension’s initialization process, to get the correct list of products that you will display on your Extension’s storefront. This helper method returns a promise, which you can use as follows:

    \n\n
    Twitch.ext.bits.getProducts().then(function(products) {\n   console.log(products); // [ { sku: 'abc123', cost: { type: 'bits', amount: '10' } } ]\n});\n
    \n\n

    For details, see getProducts in the section on Bits-in-Extension helper methods in the Extensions Reference.

    \n\n

    Exchanging Bits for a Product

    \n\n

    When a viewer wants to use Bits within an Extension, you call the useBits function on the Extension helper. This function takes in the SKU of the product the viewer wants to exchange. The function is invoked as follows:

    \n\n
    let productSku = 'abc123';\nTwitch.ext.bits.useBits(productSku);\n
    \n\n

    If the Viewer is Logged In

    \n\n

    When useBits is invoked, if the viewer is logged in, the Twitch UI displays a dialog, showing:

    \n\n
      \n
    • The current amount (in Bits) necessary to exchange for the product, even if it does not match what was displayed in the Extension. (The Bits amount could have changed since the Extension loaded the list of products in the user’s browser.)
    • \n
    • Whether there are enough Bits in the viewer’s account to exchange for the product:
    • \n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    If …Then …
    There are enough Bits in the account.A Confirm button is displayed. The dialog shows what the remaining Bits balance will be after the transaction is completed. It also informs users that clicking on the button will share their identity with your Extension.
    There are not enough Bits in the account.No Confirm button is displayed. The dialog shows how many more Bits are needed to confirm the transaction.
    \n\n
      \n
    • An option to buy more Bits (in a separate system). If a user exercises this option, some time may elapse between the user’s click on an item and the beginning of the transaction. If the user initially does not have enough Bits to exchange for a product, but then buys enough Bits, the Confirm button appears in the dialog after the purchase.
    • \n
    \n\n

    Note: Before confirmation, while the dialog UI is open, users are blocked from interacting with the Extension. Clicking anywhere outside the dialog causes the dialog to close and allows the user to interact with the Extension again. Also, users can cancel the flow at any point in the process.

    \n\n

    When a user confirms a transaction, the Bits amount displayed in the dialog is locked in.

    \n\n

    When processing is completed, a message is sent to your Extension front end through the onTransactionComplete() callback:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    If …Then …
    The product is configured in the catalog to broadcast to all users.A message is sent to all instances of your Extension running on the channel where the Bits transaction was initiated.
    The product is not configured to broadcast to all users.A message is sent only to instances of your Extension running on the channel where the Bits transaction was initiated and the viewer who initiated the transaction is logged in.
    \n\n

    If the Viewer is Not Logged In

    \n\n

    If the viewer is not logged in when useBits is invoked, the UI indicates that login is required. If there is any other error (for example, if the user is banned or the SKU was removed from the catalog after products were loaded by the Extension front end), a generic error message is displayed to the user. This message disappears after 3 seconds.

    \n\n

    For More Information

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    For …See …
    Current information on Bits pricingCheer with Bits
    Bits-related reference informationExtensions Reference
    Information to familiarize yourself with Extensions, before using Bits-in-ExtensionsExtensions documentation
    Information on JSON Web Tokens (JWTs), including how to verify themJSON Web Tokens
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","required-technical-background":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Extension Parts
    \n\t\t\n\t\t\t
    Architecture Overview
    \n\t\t\n\t\t\t
    \n\t\t\n\t\t\t
    Development and Testing 
    \n\t\t\n\t\t\t
    Pop-Out Extensions
    \n\t\t\n\t\t\t
    Twitch PubSub
    \n\t\t\n\t\t\t
    JSON Web Tokens (JWTs)
    \n\t\t\n\t\t\t
    Keep Your Secret Private
    \n\t\t\n\t\t\t
    Opaque IDs
    \n\t\t\n\t\t\t
    Focus
    \n\t\t\n\t\n\n\n\t\t

    Technical Background

    \n\n

    Extension Parts

    \n\n

    An extension has up to four parts, two required and two optional.

    \n\n

    The required parts are: 

    \n\n
      \n
    • An HTML/JavaScript front end for the broadcaster’s installation configuration. This is rendered as part of the normal extension installation flow, permitting one-time or infrequent setup.
    • \n
    • An HTML/JavaScript front end for the viewer’s experience. This is rendered in an iframe (inline frame) on the channel page.
    • \n
    \n\n

    The optional parts are:

    \n\n
      \n
    • An HTML/JavaScript front end for the broadcaster’s live experience. This is rendered in an iframe on the broadcaster’s live dashboard page. It allows the broadcaster to perform privileged operations while live (e.g., creating a new poll).
    • \n
    • An Extension Backend Service (EBS), which stores data or state and communicates with the front ends, by receiving AJAX requests or using Twitch’s PubSub architecture to broadcast to all viewers.
    • \n
    \n\n

    Architecture Overview

    \n\n

    The following figure shows the overall architecture of an Extension. In the figure, the box labelled “Front-end JavaScript HTML” represents all three front-end parts mentioned above.

    \n\n

    \"Architecture\"

    \n\n

    Development and Testing 

    \n\n

    An extension’s iframe must import the Extension Helper JavaScript file, created and hosted by Twitch, which provides methods for dealing with authentication, receiving notifications of stream properties, and listening to PubSub events. Twitch PubSub is a system that allows backend services to broadcast real-time messages to clients.

    \n\n

    While an extension is being tested, the iframe and all its assets are sourced from a URL provided by the extension developer, allowing rapid development iteration. Once the extension is ready for review by Twitch, and later in production, assets to be hosted by Twitch are copied to the Twitch CDN (Content Delivery Network) and served from there.

    \n\n

    Pop-Out Extensions

    \n\n

    If pop-out control is enabled, the extension iframe has an icon button that viewers can click to pop out the extension into its own window. If an extension is popped out:

    \n\n
      \n
    • The extension iframe resizes to take up almost the full size of the new window (all but a minimal, Twitch-controlled UI that wraps the extension).
    • \n
    • The channel page retains a placeholder where the popped-out extension was previously. The placeholder has an icon button for the viewer to return the extension back to its original position on the channel page.
    • \n
    \n\n

    To determine whether an extension is popped out, developers can refer to the query string in the Extension’s iframe URL. The popoutparameter would be included and set to “true”. For more information about all the parameters, see Client Query Parameters in the Extensions Reference.

    \n\n

    By default, pop-out control is enabled for panel Extensions and for extension “live configuration views” (see the Live Config Path setting on the Asset Hosting tab in the Extensions manager). 

    \n\n

    Twitch PubSub

    \n\n

    The Twitch PubSub system provides an additional channel for your EBS to communicate with your extension. Your extension front end can use AJAX to directly call your EBS to retrieve initial state or send viewer-initiated events (like voting). PubSub is a very efficient way for the EBS to directly broadcast real-time events or provide incremental state changes simultaneously to all instances of your extension. 

    \n\n

    In a typical use case, your EBS will use the Send Extension PubSub Message endpoint to broadcast messages to viewers. Your Extension front end will then use the Extension Helper to listen for incoming messages. For details, see PubSub in the Extensions Reference.

    \n\n

    JSON Web Tokens (JWTs)

    \n\n

    When developing Twitch extensions, it’s important to fully understand how JSON Web Tokens (JWTs) provide secure communication across Twitch, a viewer’s extension, and your EBS. If you are not familiar with JWTs, visit the official site for an introduction.

    \n\n

    Twitch Extensions uses JWTs in two contexts: 

    \n\n
      \n
    • When an extension is loaded in a broadcaster’s or viewer’s browser, a JWT is signed by Twitch and provided to the Extension Helper’s onAuthorized callback. Whenever your extension communicates with your EBS, it is best practice to send the JWT and verify it using your extension’s shared secret. This allows your EBS to verify that the request was made on behalf of the viewer or broadcaster represented by the token, and it prevents malicious users from directly calling your EBS. For details about the callback, see the Extensions Reference.\n
    • \n
    • When an EBS needs to call a Twitch API, it must generate, sign, and include a JWT in the header. This is known as “bearer token authentication.” By signing your own token with the shared secret, Twitch can authenticate that the API request is coming from your EBS.
    • \n
    \n\n

    Note: The secret provided to you in the Extensions console is a base64-encoded string. Depending on the JWT library you use, you probably will have to decode the string before using it as a parameter to sign or verify a JWT.

    \n\n

    Example: Verifying a JWT 

    \n\n
    const secret = new Buffer('NOTAREALSECRET==', 'base64');\njwt.verify(token, secret);\n
    \n\n

    Example:  Signing a JWT

    \n\n
    const secret = new Buffer('NOTAREALSECRET==', 'base64');\nconst signedToken = jwt.sign(tokenPayload, secret);\n
    \n\n

    Keep Your Secret Private

    \n\n

    While this code contains the secret as an example, we strongly recommend that you do not store your secret in your code. It is always best practice to store sensitive information such as secrets, keys, and passwords separate from code, using a dedicated secret-management system.

    \n\n

    Authentication Tokens

    \n\n

    The Extension Helper provides the iframe with an authentication JWT. When the iframe wants to communicate with its EBS, it sends this token in an HTTP header to the EBS. The JWT is signed by Twitch, using a secret shared between Twitch and the extension developer. The EBS can then use this secret to verify the incoming JWT and ensure that received messages are from a legitimate source. Also, the JWT itself contains reliable information about the role of the sender; e.g., whether the incoming message is from a viewer or a broadcaster.

    \n\n

    Opaque IDs

    \n\n

    Opaque IDs identify viewers without revealing the viewer’s Twitch identity. Using an opaque ID, developers can determine a viewer’s authenticated state. Logged-out users also have an opaque ID, but it is not guaranteed to be the same between channels or sessions.

    \n\n

    Opaque IDs persist across all channels, and they do not change unless viewers explicitly request a change (rotation). We encourage developers to use their EBS to store per-viewer information, using opaque IDs as keys. If your extension needs to know the viewer’s numeric Twitch ID, use the Request Identity Link field on the Extensions Manager Capabilities tab.

    \n\n

    Note: An opaque ID that begins with “A” is a logged-out user and should not be persisted. It will change every time the logged-out user loads your extension.

    \n\n

    The Extension Helper provides opaque identifiers and callback functions that are invoked with context information about the channel being viewed (e.g., video resolution, latency to the broadcaster, and channel ID).

    \n\n

    Focus

    \n\n

    When a viewer focuses an extension, Twitch sends focus back to the player, to ensure that keyboard shortcuts for the player continue to work. However, if an extension asks viewers to click on a form field element (for example, fieldselect, or textarea) and the viewer does so, the focus stays on the form element.

    \n\n

    Note: The Firefox browser has a known issue that prevents these input types from capturing focus.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","rig":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Creating a Project
    \n\t\t\n\t\t\t
    Rig Pages
    \n\t\t\n\t\t\t
    Troubleshooting
    \n\t\t\n\t\n\n\n\t\t

    Extensions Developer Rig

    \n\n

    Introduction

    \n\n

    The Developer Rig allows Extensions developers to develop and test Extensions quickly, easily, and locally. It is an Electron-wrapped web app that you install on your machine. It lets you test with production APIs and hosted assets on Twitch.

    \n\n

    You use the Developer Rig to create and run an extension project, using either your own extension code or example templates in the rig. An extension project is a combination of an extension manifest (metadata) and extension code. You create an extension manifest in the rig or on the Extensions developer console, and you can make this part of your extension project in the rig.

    \n\n

    The Developer Rig also can be used to manage your Bits product catalog, if you have completed Extensions monetization developer onboarding (required for non-Twitch partners/affiliates) and your extension is enabled for Bits monetization. See the Extensions Monetization Guide.

    \n\n

    If your extension is enabled for Bits monetization, when you configure the Developer Rig to run with your extension, you will see a Manage Products tab. Here, you can view, create, edit, and deprecate products — as long as your extension is enabled for Bits and you are logged in to the account that owns your extension.

    \n\n

    Creating a Project

    \n\n
      \n
    1. Download the Developer Rig for Windows, Mac, or Linux, then open the downloaded file to install the Rig:
      Linuxhttps://developer-rig.twitchcdn.net/Twitch+Developer+Rig.AppImage
      MacOShttps://developer-rig.twitchcdn.net/Twitch+Developer+Rig.dmg
      Windowshttps://developer-rig.twitchcdn.net/Twitch+Developer+Rig+Setup.exe\n
    2. \n
    3. Launch the Rig and sign in with your Twitch developer credentials.
    4. \n
    5. Click Add Project (top left), then Create Project. The first Create New Project setup screen appears.
    6. \n
    7. Fill out the fields on the first setup screen:\n
        \n
      • In the dropdown list, select New Extension (to create a new extension) or select an extension you’ve already created.
      • \n
      • If you’re creating a new extension, name your project (e.g., “<your name here> Hello World”). Project names must be globally unique.
      • \n
      • Specify the extension version. The default is 0.0.1.
      • \n
      • Click Next. The second Create New Project setup screen appears.
      • \n
      \n
    8. \n
    9. Fill out the fields on the second setup screen:\n
        \n
      • Select a folder on your filesystem for your project files.
      • \n
      • In the dropdown, choose the code to add to your project: \n
          \n
        • Tutorials (recommended for new developers).This choice presents additional options, and the instructions for each option.
        • \n
        • Boilerplate (great if you want your frontend to be in React)
        • \n
        • Your own code. 
        • \n
        \n
      • \n
      • Click Next. The code is pulled in from Github and a final Create New Project setup screen appears, indicating your project was created.
      • \n
      \n
    10. \n
    11. Click Get Started. The Project Details page appears; see below for details.
    12. \n
    \n\n

    Rig Pages

    \n\n

    The rig has several tabbed pages to assist you.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TabThis is where you ...
    Project DetailsManage project metadata, run your project (following the steps on the page), and provide information about your frontend and backend files. If you chose tutorial code above, some information here is automatically populated for you.

    The rig can host your frontend and backend if it’s running locally. To do this, click Run Front End under Front-end Host Command and/or click Run Back End under Run your back-end service locally with the Developer Rig.

    Use the Project Actions menu (top right) to:
    MonetizationMonetize your extension. Before this tab is available for use, you must complete Extensions monetization onboarding and include monetization in your extension (see the Extensions Monetization Guide).
    Configuration ServiceAccess and manage extension configuration data, for use by the Configuration Service.

    You can select what user data you want to query for, by entering the ID or channel name. You can also edit this data from the rig and save it to the configuration service, for quick changes to the data.
    Extension Views\n

    Create and interact with different views of your extension, for testing. 

    \n

    To add a new view for the configured client ID, click Create New View. Then, depending on the selected extension type, you also select one or more Viewer Types to simulate how the extension will look to different people:

    \n
      \n
    • Broadcaster
    • \n
    • Logged-in viewers (linked and unlinked)
    • \n
    • Logged-out viewers (i.e., anonymous users)
    • \n
    \n

    After you have created an extension view, you can manually change the properties of the view’s context; i.e., what is happening around it on the Twitch channel page. Click Edit Context to see the dropdown options. This is a great way to test how your extension responds to different themes on the page or the viewer’s language choice.

    \n

    Extension output logs can be redirected to the Rig console, a local console specific to the Developer Rig. The console is at the bottom of the Extension Views page. To enable your extension to output to this console, make the following call from the extension's JavaScript front end: window.Twitch.ext.rig.log(<message to log>).

    \n
    \n\n

    Troubleshooting

    \n\n

    I get an error when pulling in a tutorial or boilerplate.

    \n\n

    Ensure that Git is in your PATH variables by trying to run git at your command line. If that works, also ensure that the local folder does not currently exist.

    \n\n

    I’m sure my My Rig configuration is correct, but my extension doesn’t work.

    \n\n

    Try these steps:

    \n\n
      \n
    1. Clear your browser cache.
    2. \n
    3. Delete the Rig’s local storage: open the JavaScript console in your browser on a tab with the Rig open, execute localStorage.clear(); then refresh.
    4. \n
    5. Ensure you’ve included the Twitch Extensions Helper in your front-end files. 
    6. \n
    7. Restart the Rig.
    8. \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","submission-best-practices":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Quicker reviews and faster adoption
    \n\t\t\n\t\t\t
    Template for a helpful Walkthrough Guide and Change Log
    \n\t\t\n\t\t\t
    Extensions and offsite links
    \n\t\t\n\t\t\t
    How to write a great description
    \n\t\t\n\t\t\t
    Configuration clarity
    \n\t\t\n\t\t\t
    Branding and emotes
    \n\t\t\n\t\t\t
    Commerce in Extensions
    \n\t\t\n\t\t\t
    Bits in Extensions
    \n\t\t\n\t\t\t
    Moderation API
    \n\t\t\n\t\t\t
    Requesting user permissions
    \n\t\t\n\t\n\n\n\t\t

    Submission Best Practices

    \n\n

    With a large variety of Extensions being submitted, adoption of an Extension can be difficult for broadcasters due to the differing setups of each Extension. This document outlines best practices for submitting your Extensions for review.

    \n\n

    Quicker reviews and faster adoption

    \n\n

    When creating an Extension, keep in mind the flow broadcasters will follow the first time they use it. Following is a list of ways that you can simplify your configuration to increase adoption and speed up the review time of your Extension:

    \n\n
      \n
    • Complete a quality assurance pass on your Extension. The more you do to ensure that the setup and usage of your Extension is a smooth experience, the quicker the reviewer can get through the review and help you release your Extension. \n
        \n
      • Make sure the configuration page can be saved successfully and the Extension can be activated.
      • \n
      • Once activated check that the Extension loads when activated on a channel.
      • \n
      • Complete some functionality flows and make sure they don’t cause the user to become stuck at a certain page, or crash the Extension.
      • \n
      • Consider asking a friend or colleague that is unfamiliar with the Extension to run through the experience to see if they understand the purpose of the Extension and can navigate the flow.
      • \n
      \n
    • \n
    • While it is required to provide a review channel link, you are not required to have your review channel live while waiting for your review to be complete. Extensions that allow the broadcaster to successfully configure the Extension with no use of an external application or game data connection do not require a continuously live review channel. Panel-only Extensions also do not require a continuously live review channel. If your Extension requires a specific game environment or backend service to be live for it to function, please provide your availability for review times within 9AM - 5PM PT in the Walkthrough Guide and Change Log. We will reach out and request another review time if we find that your review channel is not live at the time of the review.
    • \n
    \n\n

    Template for a helpful Walkthrough Guide and Change Log

    \n\n

    When submitting your Extension for review, you are required to submit a review channel. While the Change Log is useful for the review team to take note of new or altered features, UI or code changes, providing a Walkthrough Guide is just as essential for a timely review. This guide can include things like testing account credentials, your chosen code language, or even required applications for your Extension to be reviewed with minimized delays. We strongly recommend including a thorough Walkthrough Guide and itemized Change Log. Please feel free use this template below:

    \n\n

    [Information regarding backend allowlists, source code, game/app requirements for review, and/or test account details if account is required]

    \n\n

    This information is essential for the review team to complete your review in a timely manner. An example of the “source code” information needed is what technology/language your code is written in and if your code is not human-readable (i.e. obfuscated, minified, etc.) Please note: if your Extension does not contain human-readable code, please use this form to submit your source code. If your Extension does not rely on any of these details, please make a note of this in the Walkthrough Guide and Change Log. 

    \n\n

    [Changelog v X.X]

    \n\n

    This should be the changelog of the current version of your Extension in review. We recommend isolating this changelog to solely the changelog of the version you are submitting for review.

    \n\n
      \n
    • Change 1
    • \n
    • Change 2
    • \n
    • Change 3
    • \n
    • And so on…
    • \n
    \n\n

    [Steps for Testing the Extension]

    \n\n

    This should be the steps of testing all of your Extension’s functionality and features. Please note: if any of these steps are not intuitive for the broadcaster, the broadcaster may not be able to set up your Extension for use.

    \n\n
      \n
    1. Step 1
    2. \n
    3. Step 2
    4. \n
    5. Step 3
    6. \n
    7. And so on…
    8. \n
    \n\n

    [Optional: Video walkthrough of Extension configuration and viewer interaction]

    \n\n

    This should be a simple walkthrough of the Extension from configuration to viewer’s experience. The video can be hosted on any public video hosting site.

    \n\n

    [Optional: Developer’s Live Review Channel Times]

    \n\n

    This should be a block of time that you can make sure to be actively streaming on your channel with the correct Extension version enabled. If you do not provide these times, or if our team cannot perform your Extension review in the time you provided, our review team will reach out to get your availability.

    \n\n

    [Optional: Additional information for the review team]

    \n\n

    This should be any additional information that you think is essential for the review team to be able to complete your Extension review that hasn’t been covered with the above topics.

    \n\n
      \n
    • Info 1
    • \n
    • Info 2
    • \n
    • Info 3
    • \n
    • And so on…
    • \n
    \n\n

    Extensions and offsite links

    \n\n

    If a linkout directly enhances the experience of an Extension’s functionality or compliments content or data found in your Extension, it can be a great option. However, in order to pass policy review, there are a few things that you should not include in your linkouts:

    \n\n
      \n
    • A landing page that has a call to action.
      A call to action is referring to buttons or text that encourages users to do something such as: sign up, download, or register. 
    • \n
    • A linkout to a social media website.
    • \n
    • A link to a site that is a competitor of Twitch.
    • \n
    • An advertising or sponsorship related page.
    • \n
    • A page whose content is unrelated to the Extension’s functionality.
    • \n
    \n\n

    We believe that if you can bring in more functionality and information through the Extension UI itself, you can create a more seamless viewer experience. This also ends up being a better outcome for streamers who are trying to maintain viewer numbers and channel engagement.

    \n\n

    How to write a great description

    \n\n

    A great Extension description is simple and straight to the point. However, there are a few key things it’s important include in your Extension description. Broadcasters need to know why they should install your Extension and what to expect when using your Extension.

    \n\n
      \n
    • The foundation of your description should be a quick explanation of the core functionality it provides and the purpose your Extension serves. 
    • \n
    • Focus on why a broadcaster should be excited to add this Extension to their list of favorite Extensions. 
    • \n
    • If there is any functionality that may not be in the actual Extension yet, or may have been removed since the description was written, make sure that your description is updated. 
    • \n
    • If your Extension has chat interaction functionality enabled and implemented, you will need to make sure that you clearly define in your Extension how it will be interacting with chat.
    • \n
    • If your Extension does not have any chat interaction functionality implemented, even if it is enabled, disable the “Has Chat” checkbox so the broadcaster isn’t alerted to chat functionality that doesn’t really exist.
    • \n
    • If your Extension has Bits functionality, you are not required to explain how the Bits exchange will work within your Extension. However, we recommend that you indicate somewhere that Bits are used so that the broadcaster is aware. If you do plan on mentioning Bits within your description, or any other part of your Extension, be sure that you are following the Bits in Extensions policies, Bits Acceptable Use policies, and the Bits in Extension Best Practices.
    • \n
    \n\n

    Here is an example of a great Extension description to use for a reference:

    \n\n\n \n \n \n \n \n
    Tower builder is cool little mini-game for your viewers to play passively or actively while watching your channel. Every 5 minutes someone is watching your channel they gain one tower block. The tower has a visual animation play if a block is added, and the block counter shows them how tall their tower is. If someone wants to get more blocks faster, they can exchange Bits for blocks! There is a leaderboard view within the Extension that allows everyone to see who has built the tallest tower. Each time a viewer reaches the top spot of the leaderboard a message gets posted to chat for all to see! Who will have the Tallest tower in all the land? Find your master builder today!
    \n\n

    Configuration clarity

    \n\n

    If your Extension requires configuration in order to activate it, putting in the extra effort to make this step user-friendly can help to increase adoption of your Extension. The configuration will be the first interaction that a broadcaster has with your Extension, and you want to make sure it makes a good impression! If the setup is confusing, or takes a long time to complete, it can be frustrating for a broadcaster looking for more of a plug and play solution. For game-matched Extensions, do not assume that there are steps or terminology that everyone who plays that game will know. Simplicity is key.

    \n\n

    Ways that you can make configuration intuitive include:

    \n\n
      \n
    • Keep as much of the configuration experience within the configuration page as possible. The less the broadcaster has to download, or register for accounts on a website, the easier it is.
    • \n
    • Use tabs on the configuration page to organize and filter different setup steps or customizations (i.e. setup tab, customization tab, information tab).
    • \n
    • Provide example text for any fields that need to be filled out by the broadcaster, such as required URLs or account credentials.
    • \n
    • Provide context for each option or requirement within the configuration page.
    • \n
    • Use an indicator to signify configuration was successful or unsuccessful. If a broadcaster needs to update something on the configuration page and a save is required to complete configuration, or if no configuration changes are needed, make this clear to the broadcaster.
    • \n
    • Notify the broadcaster if the live configuration is needed in addition to the regular configuration or if it can be useful for future updates.
    • \n
    \n\n

    Branding and emotes

    \n\n

    Everyone wants to make sure that they are getting credit for the hard work they do, and Twitch is no exception. It is best to steer clear of using Twitch-branded content, such as the Twitch Glitch, Twitch Logo, or Twitch’s global Emotes in your Extension. If you have original images or emotes, we would be happy to see those included in an Extension to make viewer engagement more personal and exciting.

    \n\n

    For more information about what content specifically is not allowed within your Extension, review our Guidelines and Policies.

    \n\n

    Commerce in Extensions

    \n\n

    Monetary transactions completed via a payment flow from within an Extension are not permitted. This means that any embedded payment options such as Amazon Pay, PayPal, or Stripe, will cause your Extension review to fail. Additionally, linking viewers to a web page where they can purchase items or services on a third-party website will also cause the Extension review to fail.

    \n\n

    For more information about Commerce, please review our Guidelines and Policies.

    \n\n

    Bits in Extensions

    \n\n

    Bits are a fantastic way to help monetize your Extension while also giving broadcasters a way to provide a premium experience. However, there are some things that you will need to watch out for in order to pass review. First, we recommend you familiarize yourself with the Bits in Extensions and the Bits Acceptable Use policies. Once you have done that, read through the tips we have listed for you to help get your Extension through the review process without hitting any speed-bumps:

    \n\n
      \n
    • Make it clear what the Bits are being used for, and how they will be used within the Extension by providing context within your Extension description.
    • \n
    • Terminology that is typically approved when referencing Bits: get, win, use, exchange, amount, give, earn.
    • \n
    • Do not use the following terminology when referencing Bits: cost, spend, donate, support, insert, sell, price, buy, purchase, cheering, betting.
    • \n
    \n\n

    It is a good idea to look through your Extension one last time before submitting for review to ensure that all references to Bits adhere to the policies. Following the policies increases your chance of having your Bits-enabled Extension approved.

    \n\n

    Another thing to keep in mind is that not all broadcasters will have Bits usage enabled on their channel. Bits can only be enabled on Partner or Affiliate channels that have opted in to use them. Before allowing the broadcaster to activate the Extension we recommend doing a check to see if their channel has opted into Bits usage. If they have not opted in, we recommend implementing one of the following options:

    \n\n
      \n
    • Disable all Bits functionality within your Extension
    • \n
    • Hide or replace the functionality with a free version
    • \n
    • Do not allow the Extension to even be activated
    • \n
    \n\n

    We believe that utilizing one of these options will create less confusion for viewers trying to use Extensions where Bits functionality is not available due to the broadcaster not having Bits usage enabled. It will also create an environment where the broadcaster has less to worry about or to explain to viewers who may have trouble with your Extension.

    \n\n

    Moderation API

    \n\n

    Extensions that enable users to generate their own content creates exciting new ways for broadcasters to interact with their community. For these Extensions, we strongly recommend implementing the following features to provide a safer experience for broadcasters and engaged viewers. To help assist with implementing these safety parameters, Twitch offers our new Moderation API.

    \n\n
      \n
    • \nAuthentication - Ask the user to grant authentication permissions before being able to submit any content through the Extension
    • \n
    • \nAttribution -  Any content, submitted by a viewer through your extension, that will be shown to the broadcaster or other viewers on the channel should have the Twitch username of the submitter clearly displayed. This is so that the moderators can take action if necessary.
    • \n
    • \nChat Ban Support - Any chat bans or timeouts for a viewer on the broadcaster’s channel should be honored by the extension. Any banned or suspended viewer should not be permitted to submit content that will be shown to the broadcaster or other viewers on the channel.
    • \n
    • \nBanned User Content Removal - If a user is banned, all of their content that can be seen by other users and has been submitted through the Extension should be removed. If the user is timed out the content they submitted through the Extension does not need to be removed.
    • \n
    • \nEnforcement Filtering - All text content submitted through the Extension must also pass through the enforcement endpoint which will determine if the submitted content meets the channel’s AutoMod requirements.
    • \n
    • \nRetroactive Manual Removal - Moderators should be able to remove any content that has been submitted through the Extension.
    • \n
    • \nProactive Review - If your Extension allows content submitted by a viewer to be shown to the broadcaster or other viewers on the channel, it should provide an option for the broadcaster and/or their moderators to approve or deny the content submission before it is seen by other viewers.
    • \n
    • \nContent History - All user-generated content being submitted through the Extension should be posted to chat. For information on the chat API click here.
    • \n
    \n\n

    Requesting user permissions

    \n\n

    Requesting users to share their ID and grant permissions to your Extension might be necessary for users to use all or some of your Extension’s functionality. Keep in mind that user privacy is a big deal and some users may be hesitant to grant permissions to something that they are unfamiliar with.

    \n\n

    In order for users to understand why they are being asked for permissions within your Extension, we recommend that you only request the permissions you need at the time that you need them. This way users should have a better idea of what their ID is needed for and might feel more comfortable sharing their ID.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","using-google-analytics-in-extensions":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Configuring your Extension to Use Google Analytics
    \n\t\t\n\t\t\t
    Note on GDPR
    \n\t\t\n\t\t\t
    Sample Code
    \n\t\t\n\t\t\t
    Next Steps
    \n\t\t\n\t\n\n\n\t\t

    Using Google Analytics in Extensions

    \n\n

    Introduction

    \n\n

    This guide explains the high-level steps needed to enable Google Analytics to track events from within your Extension.

    \n\n

    This guide does not cover Safari on Mac and the Twitch iOS app. 

    \n\n

    Configuring your Extension to Use Google Analytics

    \n\n
      \n
    1. Set up your Google Analytics account.
    2. \n
    3. Track events by adding analytics.js for events in your extension. The sample code below explains where to load the analytics.js file. Since Twitch extensions do not allow inline Javascript, you will need to load and configure the analytics.js library from within a bundled Javascript file.
    4. \n
    5. Use event measurement to track events on each page of your extension
    6. \n
    \n\n

    Some examples of events are loading of a page, clicking on a link or a button, and expanding or closing a section.

    \n\n

    Note on GDPR

    \n\n

    Google Analytics collects user IP data by default. Since this is considered personal data under GDPR (General Data Protection Regulation), we strongly recommend that developers anonymize the user’s IP address in their applications. The sample below demonstrates how to implement this.

    \n\n

    Sample Code

    \n\n

    To illustrate the steps in this guide, we have used a panel extension with the following directory structure:

    \n\n
    GA Extension/\n|\n|__js/\n| |__mobile.js\n| |__viewer.js\n| |\n|__css/\n| |__style.css\n|\n|__panel.html\n|__overlay.html\n|__component.html\n
    \n\n

    Next Steps

    \n\n

    First, add analytics.js to your viewer.js file:   

    \n\n
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');\nga('create', 'UA-123456-1', {\n    cookieFlags: 'max-age=7200;secure;samesite=none'\n});\nga('set', 'anonymizeIp', true);\n
    \n\n

    Second, send a page-load event to Google Analytics via JavaScript:

    \n\n
    $(document).ready(function() {\n    //Send page load event to GA\n    ga('send', 'event', 'Load', 'Load_'+$(\"#pageViewHeader\").text(), 'PageLoaded');\n  });\n
    \n\n

    Third, send the event to Google Analytics via JavaScript:

    \n\n
    $(document).ready(function() {\n    //Send button click event to GA\n    $(\"button\").click(function() {\n       $(this).find(\"span\").text(\"I was CLICKED\");\nga('send', 'event', 'Click', 'Click_'+$(this).attr(\"id\"), 'ButtonClickDetail');\n\n    });\n  });\n
    \n\n

    The code snippet above sends two events to Google Analytics.  The first event is tied to the loading of a page; it sends the text of the element with the ID pageViewHeader. The second event fires when a button is clicked; it sends the ID of the button element.

    \n\n

    Fourth, attach JavaScript to your panel HTML:

    \n\n
    <!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, shrink-to-fit=no\">\n    <script src=\"https://extension-files.twitch.tv/helper/v1/twitch-ext.min.js\"></script>\n    <script src=\"js/jquery-3.3.1.min.js\" type=\"text/javascript\"></script>\n    <script src=\"js/viewer.js\" type=\"text/javascript\"></script>\n    <link rel=\"stylesheet\" type=\"text/css\" href=\"css/style.css\">\n    <title>Viewer</title>\n</head>\n\n<body>\n    <div  id=\"pageViewHeader\">Hello world!</div>\n    <div></div>\n    <div>\n        <button id=\"redButton\" class=\"button button3\"><span>Red Button</span></button>\n    </div>\n    <div></div>\n    <div>\n        <button id=\"greenButton\" class=\"button\"><span>Green Button</span></button>\n    </div>\n</body>\n</html>\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","index":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    What’s new?
    \n\t\t\n\t\t\t
    What’s popular?
    \n\t\t\n\t\t\t
    Give Feedback and Get Help
    \n\t\t\n\t\t\t
    Terms of Use
    \n\t\t\n\t\n\n\n\t\t

    Twitch Developer Documentation

    \n\n

    Welcome to our documentation site! Here you’ll find the information you need to develop experiences on Twitch.

    \n\n

    What’s new?

    \n\n

    These docs have been most recently updated:

    \n\n\n\n

    What’s popular?

    \n\n

    Some popular reading:

    \n\n\n\n

    Give Feedback and Get Help

    \n\n

    For help using our developer tools or to let us know about product or documentation issues:

    \n\n\n\n

    Terms of Use

    \n\n

    By accessing or using Twitch API, you agree to comply with and be bound by the Twitch Developer Services Agreement. If you do not agree to be bound by the Twitch Developer Agreement, do not access or otherwise use the Twitch API.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","insights":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Drops Analytics (Beta)
    \n\t\t\n\t\t\t
    Extension Developer Analytics
    \n\t\t\n\t\t\t
    Game Developer Analytics
    \n\t\t\n\t\t\t
    Twitch Quarterly Insights
    \n\t\t\n\t\n\n\n\t\t

    Insights & Analytics

    \n\n

    Introduction

    \n\n

    Twitch Insights provides game and extension developers with analytics data to help developers make data-driven decisions about future development. As a developer, you can use this data to enhance the experience of broadcasters and viewers and optimize how they engage with your games and extensions on Twitch

    \n\n

    Once a data field is added to a report, it will not be deleted in future versions of the report. New data fields may be added in new versions of the report, anywhere in the sequence of fields (that is, not necessarily at the end of the CSV).

    \n\n

    Counting Device IDs

    \n\n

    As explained below, some unique data fields (for example, Unique Viewers) are collected based on device IDs. At a given moment, a device ID is assigned to a single hardware device. For example, if someone loads an extension or watches a game on 2 devices, that involves 2 device IDs and counts as 2 Unique Viewers.

    \n\n

    Web browsers store device IDs using cookies. The half-life of a cookie seems to be about 14 days, even if you ask the browser to store the cookie forever. So, on any given day, we can assume that a browser always provides the same device ID for a given device. But over a month, most browsers provide at least 2 device IDs for the same device, one ID initially and another after clearing and refreshing the cookie.

    \n\n

    This applies primarily to the web platform. Mobile apps and console platforms have different storage regimes, and device IDs are much more durable in those environments.

    \n\n

    How does this affect Insights data collection? On a particular day, this has very little impact, as we can expect 1 device to have only 1 device ID. Over time, though, 1 device will have multiple device IDs. As a result, there is a significant impact on Insights data fields that count device IDs over long periods of time (30 days or more). For these fields, the number of uniques is likely to be much higher than the number you get by extrapolating from shorter time periods. The major impact is on the Last 30 Days data fields, especially if your game or extension is used primarily from web browsers. For example, for Extensions that run only in browsers, the number of Unique Viewers Last 30 Days will be much higher than the number of Unique Viewers times 30.

    \n\n

    Drops Analytics (Beta)

    \n\n

    Drops Analytics provides reporting on Drops Campaign performance, including full details on individual Drop reach and the top streamers engaging with your campaigns. Drops Analytics is available to all users of the current Drops product (i.e., there are no analytics provided for Legacy Drops). 

    \n\n

    To access Drops Analytics for a campaign:

    \n\n
      \n
    1. Navigate to a Drops Campaign that has been live for at least 48 hours.
    2. \n
    3. On the campaign page, each click the three dot button at the end of each campaign entry on the overview table. You see the option to download one of three reports as they are available.
      \"screen\n
    4. \n
    \n\n

    There are three reports available for download::

    \n\n
      \n
    • \n[campaign_id]_campaigns_overview_[date].csv - a report detailing the performance of your campaign each day it has been live on Twitch, populated 48 hours after the campaign has run for at least one full day.
    • \n
    • \n[campaign_id]_campaigns_drops_overview_[date].csv - a report detailing the performance of individual drops each day it has been live on Twitch, populated 48 hours after the campaign has run for at least one full day.
    • \n
    • \n[campaign_id]_campaigns_top_streamers_[date].csv - a report detailing the top 10 streamers and the activity around your campaign on those channels, populated 48 hours after the campaign has run for at least one full day.
    • \n
    \n\n

    Data starts being collected after the campaign is active, subject to a one-day delay. For example, we start calculating the data for January 12th on January 14th at UTC 0:00. Typically the calculations complete within 4 hours. The report is uploaded as soon as the calculations are done.

    \n\n

    Terminology

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    TermDefinition
    CampaignA time bound event where viewers will be eligible to earn Drops based on meeting various conditions while watching a Drops enabled stream. 
    DropA group of rewards released when a viewer meets the conditions for the Drop
    GameThe category that streamers must select in order to participate in the Drops Campaign 
    RewardAn item awarded to viewers as part of a Drop.
    ChannelA Twitch channel that participated in the Drops Campaign, because they streamed the game during the campaign period.
    \n\n

    Data Fields

    \n\n

    Note that all counts are for the corresponding day in the CSV file.

    \n\n

    If there is no data for a day, either that day is missing from the report or it is in the report with all data fields having a value of 0 (i.e., no activity).

    \n\n

    Campaign Overview Report

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Column NameDescription
    Record DateUTC Date for the data in each row. For example, data in the row for 2020-08-28 covers the period from 2020-08-28T00:00:00Z to 2020-08-28T23:59:59Z.
    Campaign IDID of Drops Campaign.
    Campaign NameName of Campaign.
    Game IDID of the campaign’s game. Note that it is possible to change the game after the campaign’s gone live.
    Game NameName of the game.
    Streamers EligibleNumber of unique channels/streamers who streamed the game and had Drops enabled.
    Viewers EligibleNumber of unique viewers who were present in channels that were streaming during the campaign and saw the campaign notification.
    Event-Based Drops EarnedNumber of unique eligible viewers that earned an event-based Drop on the given date.
    Time-Based Drops EarnedNumber of unique eligible viewers that earned a time-based Drop  on the given date.
    Viewers ClaimedNumber of unique viewers that claimed a Drop on a given date.
    Viewers Linked and ClaimedNumber of unique viewers that claimed a Drop, who also have their account linked to the game at the time of claim on the given date.
    Streamers Eligible (Cumulative)Number of unique channels/streamers who streamed the game and had Drops enabled since the beginning of the campaign to the record date.
    Viewers Eligible (Cumulative)Number of unique viewers who were present in channels that were streaming and saw the campaign notification from the beginning of the campaign to the record date.
    Event-Based Drops Earned (Cumulative) Number of unique eligible viewers that earned an event-based Drop from the beginning of the campaign to the record date.
    Time-Based Drops Earned (Cumulative)Number of unique eligible viewers that earned a time-based Drop  from the beginning of the campaign to the record date.
    Viewers Claimed (Cumulative)Number of unique viewers that claimed a Drop from the beginning of the campaign to the record date.
    Viewers Linked and Claimed (Cumulative)Number of unique viewers that claimed a Drop who also have their account linked to the game at the time of claim from the beginning of the campaign to the record date.
    \n\n

    Campaign Overview - Drops Report

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Column NameDescription
    Record DateUTC Date for the data in each row. For example, data in the row for 2020-08-28 covers the period from 2020-08-28T00:00:00Z to 2020-08-28T23:59:59Z.
    Campaign IDID of Drops Campaign.
    Campaign NameName of Campaign.
    Drop IDID of the Drop.
    Drop NameName of Drop.
    Game IDID of the campaign’s game. Note that it is possible to change the game after the campaign’s gone live.
    Game NameName of the game.
    Streamers EligibleNumber of unique channels/streamers who streamed the game and had drops enabled.
    Event-Based Drops EarnedNumber of unique eligible viewers that earned an event-based Drop on the given date.
    Time-Based Drops EarnedNumber of unique eligible viewers that earned a time-based Drop on the given date.
    Viewers ClaimedNumber of unique viewers that claimed the Drop on the given date.
    Viewers Linked and ClaimedNumber of unique viewers that claimed the Drop, who also have their account linked to the game at the time of claim on the given date.
    \n\n

    Campaign Overview - Top Streamers (10 per day)

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Column NameDescription
    Record DateUTC Date for the data in each row. For example, data in the row for 2020-08-28 covers the period from 2020-08-28T00:00:00Z to 2020-08-28T23:59:59Z.
    Campaign IDID of Drops Campaign.
    Campaign NameName of Campaign.
    ChannelName of the channel.
    Viewers EligibleNumber of unique viewers who were present in the channel during the campaign and saw the campaign notification.
    Event-Based Drops EarnedNumber of unique eligible viewers that earned an event-based Drop on this channel on the given date.
    Time-Based Drops EarnedNumber of unique eligible viewers that earned a time-based Drop on this channel on the given date.
    Viewers ClaimedNumber of unique viewers that claimed a Drop on the given date.
    Viewers Linked and ClaimedNumber of unique viewers that claimed a Drop, who also have their account linked to the game at the time of claim on the given date.
    \n\n

    Extension Developer Analytics

    \n\n

    To download this data:

    \n\n

        1. On your Twitch developer console, go to the Extensions tab.
        2. On the line for the extension for which you want data, click Download CSV.

    \n\n

    Data is provided as one CSV file per released extension. The file contains one row of data per day, from January 31, 2018 until the current day. Fields related to minimization are provided only as of June 22, 2018 (as noted in the following table). The file contains all data fields in the latest version of Extension analytics.

    \n\n

    Data starts being collected after the Extension is installed and viewed, subject to a one-day delay. For example, we start calculating the data for January 12 on January 14 at UTC 1:00. Typically the calculations complete within 1 hour. The report is uploaded as soon as the calculations are done.

    \n\n

    Also see the Get Extension Analytics endpoint in the Twitch API. The endpoint returns a URL that you can use to download the CSV files. The endpoint can be used to return any report type of Extension analytics data.  

    \n\n

    Data Fields (Overview Reports)

    \n\n

    All counts are for the corresponding day in the CSV file. If there is no data for a day, either that day is missing from the report or it is in the report with all data fields having a value of 0 (that is, no activity).

    \n\n

    Except where noted, all metrics count events from desktop browsers, mobile browsers, and the Twitch app.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Column NameDescription
    DateUTC date for the data in each row. For example, data in the row for 2018-08-01 (August 1, 2018) covers the period from 2018-08-01T00:00:00Z to 2018-08-01T23:59:59Z.
    Extension  NameName of the extension. Since the name can change and may take a few days to update internally, the Extension Client ID (which does not change) is preferable as an identifier.
    Extension Client IDAlphanumeric identifier for the extension.
    Extension Details Page VisitsNumber of visitor page loads of the extension’s Details page (https://www.twitch.tv/ext/<extension_id-version>. Reloading the page counts as multiple visits.
    Unique Extension Details Page VisitsNumber of unique visitor page loads of the extension’s Details page. Specifically this measures unique device IDs (see Counting Device IDs).
    InstallsNumber of install events of the extension.
    UninstallsNumber of uninstall events of the extension.
    ActivationsNumber of activation events of the extension.
    Unique Active ChannelsNumber of unique broadcaster channel IDs that had at least one render while the extension is active. This can be interpreted as the number of unique broadcasters that used your extension on their channel and received at least one viewer. If a broadcaster streams with your extension but the extension has no viewers, that is not captured here.

    Unique Active Channels Last 7 Days

    Number of Unique Active Channels in the past 7 days. For example, if this metric is provided on July 31, it would cover July 25-31.
    Unique Active Channels Last 30 DaysNumber of Unique Active Channels in the past 30 days. For example, if this metric is provided on July 31, it would cover July 2-31.
    Unique Identity LinksNumber of unique user IDs that granted the extension access to their Twitch user IDs. Users can grant and revoke access multiple times. On any given day, only the first grant is counted.
    Unique Identity UnlinksNumber of unique users who revoked access to their Twitch user IDs. Users can grant and revoke access multiple times; on any given day, only the first revoke is counted. 
    RendersNumber of user page loads, watching channels with the extension. A page refresh counts as a render.
    Unique RenderersNumber of unique users with a “renders” event. Specifically, this measures unique device IDs (see Counting Device IDs).
    Unique Renderers Last 7 DaysNumber of Unique Renderers in the past 7 days. For example, if this metric is provided on July 31, it would cover July 25-31.
    Unique Renderers Last 30 DaysNumber of Unique Renderers in the past 30 days. For example, if this metric is provided on July 31, it would cover July 2-31.Note this may be unexpectedly high; see Counting Device IDs.
    ViewsNumber of times that 75% or more of the extension iframe was visible in any viewer’s browser. For panel extensions, this may be less than the number of renders, if the extension is rendered but the viewer does not scroll down to view it. Scrolling up and down multiple times does not count as multiple views.
    Unique Viewers\n

    Number of different viewers who watched this extension on Twitch, based on the Views definition above. Specifically, this measures unique device IDs (see Counting Device IDs).

    \n

    If your extension is shown by a given device ID in multiple ways (panel, video overlay, video component), that counts as 2 Unique Viewers (1 for the panel and 1 for the video overlay and/or component).

    \n
    Unique Viewers Last 7 DaysNumber of Unique Viewers in the past 7 days. For example, if this metric is provided on July 31, it would cover July 25-31.
    Unique Viewers Last 30 DaysNumber of Unique Viewers in the past 30 days. For example, if this metric is provided on July 31, it would cover July 2-31. Note this may be unexpectedly high; see Counting Device IDs.
    MouseentersNumber of times a mouse pointer enters (hovers over) the extension. This counts only desktop browser events.
    Unique MouseentersNumber of unique Mouseenter events. Specifically, this measures unique device IDs (see Counting Device IDs). This counts only desktop browser events.
    Unique Mouseenters Last 7 DaysNumber of Unique Mouseenters in the past 7 days. For example, if this metric is provided on July 31, it would cover July 25-31.
    Unique Mouseenters Last 30 DaysNumber of Unique Mouseenters in the past 30 days. For example, if this metric is provided on July 31, it would cover July 2-31.
    Mouseenters Per ViewerAverage number of Mouseenter events per viewer. Defined as Mouseenters / Unique Viewers
    Mouseenter RateIndicates the ratio of Unique Viewers who also have mouseenter events. Defined as Unique Mouseenters / Unique Viewers. 
    Clicks*Number of click events in the extension iframe.
    Unique Interactors*Number of unique click events in the extension iframe. Specifically, this measures unique device IDs (see Counting Device IDs).
    Unique Interactors* Last 7 DaysNumber of Unique Interactors in the past 7 days. For example, if this metric is provided on July 31, it would cover July 25-31.
    Unique Interactors* Last 30 DaysNumber of Unique Interactors in the past 30 days. For example, if this metric is provided on July 31, it would cover July 2-31. Note this may be unexpectedly high; see Counting Device IDs.
    Clicks Per Interactor*Average number of click events per interactor. Defined as: Clicks / Unique Interactors.
    Interaction Rate*Indicates the ratio of interactors to viewers. Defined as: Unique Interactors / Unique Viewers.
    MinimizationsNumber of times a viewer minimizes (hides) the extension. This field is provided from June 22, 2018 on.
    Unique MinimizersNumber of times a viewer minimizes (hides) the extension. This field is provided from June 22, 2018 on.
    Minimization RateIndicates how often viewers minimize the extension. Defined as Unique Minimizers / Unique Viewers. This field is provided from June 22, 2018 on.
    UnminimizationsNumber of times a viewer unhides the extension after it was minimized. Unminimizations can happen for extensions that were minimized in previous days. This field is provided from June 22, 2018 on.
    Unique UnminimizersNumber of Unique Viewers that unhide the extension after it was minimized. This field is provided from June 22, 2018 on. 
    Unminimization RateIndicates how often viewers unhide the extension after it was minimized. Defined as Unique Unminimizers / Unique Viewers. This field is provided from June 22, 2018 on.

    Bits Revenue USD

    (Bits-enabled Extensions only) Revenue share earned by the developer from Bits transactions (in US dollars): this is Bits * 20% share * $.01/bit conversion rate. For more information about Bits in Extensions, see the Extensions Monetization Guide.
    Bits Used(Bits-enabled Extensions only) Number of Bits used.
    Bits Transactions(Bits-enabled Extensions only) Number of Bits transactions.
    Bits Per Transaction(Bits-enabled Extensions only) Average number of Bits per transaction. Defined as Bits Used / Bits Transactions.
    Unique Bits Users(Bits-enabled Extensions only) Number of unique users who used Bits in the extension. This is measured by user IDs, not device IDs.
    Unique Bits Users Last 7 Days(Bits-enabled Extensions only) Number of unique users who used Bits in the extension in the last 7 days. For example, if this metric is provided on July 31, it would cover July 25-31. This is measured by user IDs, not device IDs.
    Unique Bits Users Last 30 Days(Bits-enabled Extensions only) Number of unique users who used Bits in the extension in the last 30 days. For example, if this metric is provided on July 31, it would cover July 2-31. This is measured by user IDs, not device IDs.
    Bits Used Per User(Bits-enabled Extensions only) Average number of Bits per user. Defined as Bits Used / Unique Bits Users.
    \n\n

    NOTE: Click events will include false positives, as viewers often click into the player to reveal the Extension or other player controls. This is especially true for Overlay Extensions. You are allowed to implement Google Analytics to further instrument your Extension.

    \n\n

    Partial Sample File

    \n\n

    For brevity, in this sample file we show data for only 10 days.

    \n\n
    Date,Extension Name,Extension Client ID,Extension Details Page Visits,Unique Extension Details Page Visits,Installs,Uninstalls,Activations,Unique Active Channels,Unique Active Channels Last 7 Days,Unique Active Channels Last 30 Days,Unique Identity Links,Unique Identity Unlinks,Renders,Unique Renderers,Unique Renderers Last 7 Days,Unique Renderers Last 30 Days,Views,Unique Viewers,Unique Viewers Last 7 Days,Unique Viewers Last 30 Days,Mouseenters,Unique Mouseenters,Unique Mouseenters Last 7 Days,Unique Mouseenters Last 30 Days,Mouseenters Per Viewer,Mouseenter Rate,Clicks,Unique Interactors,Unique Interactors Last 7 Days,Unique Interactors Last 30 Days,Clicks Per Interactor,Interaction Rate,Minimizations,Unique Minimizers,Minimization Rate,Unminimizations,Unique Unminimizers,Unminimization Rate,Bits Revenue USD,Bits Used,Bits Transactions,Bits Per Transaction,Unique Bits Users,Unique Bits Users Last 7 Days,Unique Bits Users Last 30 Days,Bits Used Per User\n5/31/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz51,42,13,18,5,9,164,462,756,51,8,23954,13084,80730,168982,23954,13084,80730,168982,51796,7564,40166,79960,3.9587,0.5781,6512,1365,6848,15464,4.7707,0.1043,410,369,0.0282,12,10,0.0009,1.08,540,32,16.875,30,132,417,18\n6/1/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz52,30,11,14,5,5,124,434,714,37,5,17286,9308,79066,163978,17286,9308,79066,163978,40010,5462,39166,77026,4.2985,0.5868,4412,1182,6926,14972,3.7327,0.127,292,273,0.0293,10,8,0.0011,0.87,435,38,11.4474,15,117,402,29\n6/2/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz53,21,8,14,5,5,128,440,694,15,2,7930,5220,84282,163124,7930,5220,84282,163124,10516,2208,42176,75940,2.0146,0.423,1700,411,7636,14716,4.1363,0.0787,60,51,0.0098,4,4,0.0008,0.06,30,4,7.5,6,117,396,5\n6/3/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz54,30,11,11,6,5,132,438,678,27,2,28412,21270,87358,165508,28412,21270,87358,165508,33464,7638,44426,76154,1.5733,0.3591,5356,1290,8760,14664,4.1519,0.0606,250,312,0.0147,4,4,0.0002,0.69,345,8,43.125,9,129,405,38.3333\n6/4/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz55,31,10,16,4,8,184,442,654,51,6.5,31360,18238,80720,152212,31360,18238,80720,152212,62222,9678,44510,72208,3.4117,0.5307,7754,1986,10142,14124,3.9043,0.1089,466,477,0.0262,18,18,0.001,1.14,570,36,15.8333,33,162,408,17.2727\n6/5/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz56,29,11,19,4,7,130,412,616,31,3.5,25562,14628,75620,147288,25562,14628,75620,147288,53390,7916,41896,69244,3.6498,0.5412,6670,1620,9414,13428,4.1173,0.1107,410,405,0.0277,2,2,0.0001,1.08,540,12,45,9,153,405,60\n6/6/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz57,35,12,15,4,7,162,388,592,39,5,29130,18574,72038,144320,29130,18574,72038,144320,59696,10256,39912,66560,3.214,0.5522,7512,1884,8876,12836,3.9873,0.1014,458,507,0.0273,26,16,0.0014,1.32,660,58,11.3793,30,165,420,22\n6/7/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz58,26,8,12,3,5,124,348,554,31,5,24184,14830,62452,138678,24184,14830,62452,138678,50960,7926,34506,61998,3.4363,0.5345,8434,1860,8056,12108,4.5344,0.1254,552,504,0.034,30,18,0.002,0.72,360,10,36,12,144,411,30\n6/8/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz59,20,7,12,4,6,120,330,542,43,6.5,19732,12308,58580,133930,19732,12308,58580,133930,39890,6588,31670,59152,3.241,0.5353,7256,1560,7294,11356,4.6513,0.1267,436,468,0.038,14,14,0.0011,0.81,405,28,14.4643,18,150,411,22.5\n6/9/2018,test extension,hs5z3fh5dxhshfhazhk4hq38g9hz60,24,8,12,3,7,134,324,538,41,6.5,30622,17092,56124,129834,30622,17092,56124,129834,63590,9626,29608,56998,3.7205,0.5632,11176,2493,6692,10768,4.483,0.1459,726,624,0.0365,16,14,0.0009,1.89,945,14,67.5,15,141,429,63\n
    \n\n

    Game Developer Analytics

    \n\n

    Game Developer Analytics provides a full spectrum of your game’s performance on Twitch, including aggregate hours watched and number of concurrent streamers. It is available only to users who have registered an organization and claimed their game via the Twitch Developer Console. See Organization Management for more information.

    \n\n

    To download this data:

    \n\n
      \n
    1. On your Twitch developer console, navigate to your organization console using the top navigation drop down. Then, click on the Games tab.
    2. \n
    3. Under the game for which you want data, click Export Daily CSV.

      If the button does not appear, the game does not meet the minutes-watched threshold for report generation. A report is available only if the game was broadcast for at least 300 minutes (5 hours) over the time period covered by the report.
    4. \n
    \n\n

    Data is provided as one CSV file per game. The file contains one row of data per day, for the past 365 days. The file contains all data fields in the latest version of game analytics.

    \n\n

    Data starts being collected after the game is broadcast and viewed, subject to a one-day delay. For example, we start calculating the data for January 12 on January 14 at UTC 0:00. Typically the calculations complete within 4 hours. The report is uploaded as soon as the calculations are done.

    \n\n

    Also see the Get Game Analytics endpoint in the Twitch API. The endpoint returns a URL that you can use to download the CSV files.

    \n\n

    Terminology

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    TermDefinition
    LiveLive broadcast or premiere.
    Not-LiveRerun or VOD.
    RerunSubsequent (not live) streaming of any past broadcast.
    VODVideo on Demand. VODs are asynchronous pieces of content that viewers can watch whenever they like. A VOD may be a past broadcast, a highlight of a past broadcast, an uploaded video, or a clip (short, non-live streams created by viewers).

    Clips are not included in the developer analytics data described in this document. Clips data is available via the clips-discovery API.
    VodcastAn old term, which at Twitch comprises what are now known as premieres and reruns.
    \n\n

    Data Fields (Overview Reports)

    \n\n

    Note that all counts are for the corresponding day in the CSV file.

    \n\n

    If there is no data for a day, either that day is missing from the report or it is in the report with all data fields having a value of 0 (i.e., no activity).

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Column NameDescription
    DateUTC date for the data in each row. For example, data in the row for 2018-08-01 (August 1, 2018) covers the period from 2018-08-01T00:00:00Z to 2018-08-01T23:59:59Z.
    GameName of the game.
    Game IDID of the game.
    Total ViewsSum of Live Views + Not-Live Views.
    Live ViewsNumber of times any stream of this game was viewed on Twitch, live. This includes live streams and Premieres. If someone watches a game 5 separate times in a day, that counts as 5 views here.
    Not-Live ViewsNumber of times any stream of this game was viewed on Twitch, not live. This includes Reruns and VODs.
    Total Unique ViewersNumber of different viewers who watched this game on Twitch live or not-live. Specifically this measures unique device IDs (see Counting Device IDs).
    Live Unique ViewersNumber of Unique Viewers who watched this game live on Twitch. Specifically this measures unique device IDs (see Counting Device IDs).
    Not-Live Unique ViewersNumber of Unique Viewers who watched this game not-live on Twitch. As above, this measures unique device IDs (see Counting Device IDs).
    Average Concurrent ViewersAverage number of concurrent CCUs of this game, across Twitch.
    Peak Concurrent ViewersPeak number of concurrent viewers of this game, across Twitch.
    Peak Time - Concurrent ViewersUTC timestamp that corresponds to Peak Concurrent Viewers.
    Total Hours WatchedSum of Live Hours Watched + Not-Live Hours Watched.
    Live Hours WatchedNumber of hours this game was watched live on Twitch.
    Not-Live Hours WatchedNumber of hours this game was watched not-live on Twitch.
    Unique BroadcastersNumber of unique broadcasters who live-streamed this game on Twitch. Specifically, this measures unique channel IDs.
    Hours BroadcastNumber of hours of this game that were broadcast on Twitch live.
    Average Concurrent BroadcastersAverage number of broadcasters simultaneously streaming this game.
    Peak Concurrent BroadcastersPeak number of broadcasters simultaneously streaming this game.
    Peak Time - Concurrent BroadcastersUTC timestamp that corresponds to Peak Concurrent Broadcasters.
    Live Unique Chat ParticipantsNumber of live unique chat participants for this game, across Twitch.
    Total Live Chat Messages SentNumber of chat messages for this game, across Twitch.
    Unique Active Channels with ExtensionsNumber of unique broadcaster channel IDs streaming your game, which had at least one render while an extension was active. This can be interpreted as the number of unique broadcasters that used an extension on their channel and received at least one render while streaming your game. If a broadcaster streams with an extension but the extension does not render for any viewers, that is not captured here.
    Unique Active ExtensionsNumber of unique extensions related to Unique Active Channels with Extensions. Note that while the report is game-specific, some of the extensions may not be specific to the game.
    Clips CreatedNumber of Clips created from this game.
    Clip ViewsNumber of times any Clips of this game were watched.
    Top Clip URLURL of the most-watched clip of this game.
    Top Clip URL EmbedURL of the most-watched clip of this game, which you can embed in your site or blog. This is the same clip as for Top Clip URL, but the URL here contains additional parameters relevant to embedding clips (see Non-Interactive Frames for Clips). (Note: This URL contains a tt_mediumparameter. Ignore this; it is used only internally by Twitch.)
    \n\n

    Sample File (Partial)

    \n\n

    For brevity, in this sample file we show data for only 10 days.

    \n\n
    Date,Game,Game ID,Total Views,Live Views,Not-Live Views,Total Unique Viewers,Live Unique Viewers,Not-Live Unique Viewers,Average Concurrent Viewers,Peak Concurrent Viewers,Peak Time - Concurrent Viewers,Total Hours Watched,Live Hours Watched,Not-Live Hours Watched,Unique Broadcasters,Hours Broadcast,Average Concurrent Broadcasters,Peak Concurrent Broadcasters,Peak Time - Concurrent Broadcasters,Live Unique Chat Participants,Total Live Chat Messages Sent,Unique Active Channels with Extensions,Unique Active Extensions,Clips Created,Clip Views,Top Clip URL,Top Clip URL Embed\n1/1/18,TestGame,123456,30000,10000,20000,25893,19990,25550,12345,5103,6:41 AM,23234.09,1000.01,2000.04,100,213.18,23,12,12:00 AM,1675,10000,54,20,149,1000,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/2/18,TestGame,123456,30001,10001,20000,24239,19991,25551,14932,6018,12:00 AM,21093.45,1000.02,2012.34,92,199.34,45,21,12:00 AM,2345,10001,79,54,200,2000,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/3/18,TestGame,123456,30002,10002,20000,25552,19992,25552,13467,8012,12:00 AM,23234.09,1000.03,2024.64,40,220.09,10,34,12:00 AM,1321,10010,23,19,145,2001,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/4/18,TestGame,123456,30003,10003,20000,26789,19993,25553,12345,4521,12:00 AM,21093.45,1000.04,2036.94,55,79.08,23,12,12:00 AM,1234,10090,234,167,233,2010,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/5/18,TestGame,123456,30004,10004,20000,28908,19994,25554,14932,5103,12:00 AM,23234.09,1000.05,2049.24,65,213.18,45,21,12:00 AM,990,10000,54,20,50,2098,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/6/18,TestGame,123456,30005,10005,20000,28992,19995,25555,13467,6018,12:00 AM,21093.45,1000.06,2061.54,110,199.34,10,34,12:00 AM,1675,10001,79,54,149,1999,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/7/18,TestGame,123456,30006,10006,20000,24239,19996,25556,12345,8012,12:00 AM,23234.09,1000.07,2073.84,89,220.09,23,12,12:00 AM,2345,10010,23,19,200,1000,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/8/18,TestGame,123456,30007,10007,20000,25552,19997,25557,14932,5103,12:00 AM,21093.45,1000.08,2086.14,77,213.18,45,21,12:00 AM,1321,10090,234,167,145,2000,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/9/18,TestGame,123456,30008,10008,20000,26789,19998,25558,13467,6018,12:00 AM,23234.09,1000.09,2098.44,100,199.34,10,34,12:00 AM,1234,10000,54,40,233,2001,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n1/10/18,TestGame,123456,30009,10009,20000,28908,19999,25559,12345,8012,12:00 AM,21093.45,1000.1,2110.74,130,220.09,21,12,12:00 AM,990,10001,79,56,50,2010,https://clips.twitch.tv/dummyvideo?tt_medium=dx_insights,https://clips.twitch.tv/embed?clip=dummyvideodonotclick&tt_medium=dx_insights\n...\n
    \n\n

    Twitch Quarterly Insights

    \n\n
    \n

    As of February 1, 2021, Twitch Quarterly Insights is deprecated and will be decommissioned on April 5, 2021 in favor of Game Developer Analytics. Read the full announcement.

    \n
    \n\n

    Twitch Quarterly Insights is a quarterly fact sheet produced on a per-game basis, for each game broadcast on Twitch. To access this:

    \n\n
      \n
    1. On your Twitch developer console, navigate to your organization via the top navigation drop down menu. Then click on the Games tab.
    2. \n
    3. Under the game for which you want to view Twitch Quarterly Insights, click View Quarterly Insights.
    4. \n
    \n\n

    The view defaults to the latest quarter of data available. To view an older quarter, select it at the top of the sheet.

    \n\n

    Using Twitch Quarterly Insights

    \n\n

    Twitch Quarterly Insights are available for each quarter of the calendar year, starting with 2018 Q2. There is a fact sheet customized for each game that meets minimum thresholds (described below). The fact sheet organizes information into several sections:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    Fact Sheet SectionDescription
    6 key metrics about your viewers and broadcasters\n

    hours watched is the same as the Total Hours Watched field in the game analytics CSV, aggregated by quarter instead of by day.

    \n

    hours broadcast  is the same as the Hours Broadcast field in the game analytics CSV, aggregated by quarter instead of by day.

    \n

    unique viewers is the same as the Total Unique Viewers field in the game analytics CSV, aggregated by quarter instead of by day.

    \n

    unique broadcasters is the same as the Unique Broadcasters field in the game analytics CSV, aggregated by quarter instead of by day.

    \n

    viewing sessions is the number of times this game was watched.

    \n

    broadcasting sessions is the number of times this game was streamed for at least 90 seconds continuously.

    \n

    Below each metric, we show quarter-over-quarter (Q/Q) information about the rate of change from the prior quarter to this quarter. Positive Q/Q changes are reflected with a green triangle next to the metric; neutral or negative changes, a yellow triangle.

    \n

    This section contains custom (game-specific) data if your game was streamed for at least 300 minutes during the quarter; otherwise, it has key metrics for Twitch overall.

    \n
    What's Trending\n

    Top Broadcaster shows the top broadcaster who streamed your game this quarter. This is based on a combination of hours broadcast, hours watched, and average concurrent viewers.

    \n

    Dedicated Broadcaster shows the most dedicated non-partnered broadcaster who streamed your game this quarter. This is based on a combination of the number of broadcasting sessions and the number of hours per session during the quarter. “Dedicated” broadcasters are those who devote at least half of their total quarterly stream time to this game.

    \n

    Rising Star shows the rising star broadcaster who streamed your game this quarter, defined as the broadcaster with the greatest Q/Q growth in hours broadcast.

    \n

    This section contains custom data if your game had broadcasters during the last quarter that fit Top Broadcaster, Dedicated Broadcaster, and Rising Star, otherwise, you will see a sample of popular channels on Twitch instead of game-specific information.

    \n
    Social Impact\n

    Statistics on chat messages, audience engagement, and broadcasting by Twitch partners and affiliates.

    Click Get Started with Bounty Board to learn more about the Twitch Bounty Board product (where you can sponsor Twitch influencers to stream your game) or contact the Bounty Board team.
    Audience Insights\n

    Games Your Community Loves to Stream shows other games your broadcasters stream and the percentage of broadcasters who streamed those games.

    \n

    Games Your Community Loves to Watch shows other games your viewers watch and the percentage of viewers who watched those games. To be counted here, a device must have watched the game more than 90 minutes over the quarter.

    \n

    Broadcaster Geo Growth and Viewer Geo Growth highlight Q/Q growth of broadcasters and viewers of your game, in geographic areas with the greatest growth.

    \n

    This section contains custom data if your game was streamed on Twitch during the quarter, otherwise, this section displays information about popular games the community streams or watches on Twitch.

    \n
    Drops\n

    Information about your game’s Drops campaigns.

    \n

    If your game had Drops campaigns during the quarter, this section highlights total drops received, unique viewers who received a drop, and number of active campaigns as well as their Q/Q growth. Click Manage Drops Campaigns for details.

    This section contains custom data if your game had active Drops campaigns for the quarter; otherwise, this section highlights success stories from our Drops customers. Click Get Started with Drops to learn more.
    Extensions\n

    Information about popular Extensions broadcasters use when streaming your game. If extensions are not used with your game, this section highlights popular extensions on Twitch.

    \n

    Curious about building an extension? Click Get Started with Extensions to learn more.

    \n
    \n\n

    At the bottom of the sheet:

    \n\n
      \n
    • Click Download CSV Data to export the Twitch Quarterly Insights data in CSV format. This export is available only for custom game data: if your game does not meet the minimum threshold or have custom data for any section of the fact sheet, this button is not available.

      “Custom data” means that there is data custom to your game vs. generic data. We only provide data via CSV for custom game data we do not provide data via CSV for generic data.
    • \n
    • Click Print Poster View to bring up a view of the fact sheet that is optimized for printing on A2, A3, or 11x17 page sizes. To print (hardcopy or PDF), click File > Print or type Ctrl-P to access your browser’s print dialog. Specify portrait layout, the desired paper size, and no margins; enable background graphics; and disable headers and footers.
    • \n
    • Click Contact Twitch Insights Team to email us with questions. You also can provide feedback, at insights@twitch.tv.
    • \n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","irc":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Overview
    \n\t\t\n\t\t\t
    Building the Bot
    \n\t\t\n\t\t\t
    Next Steps
    \n\t\t\n\t\n\n\n\t\t

    Getting Started with Chatbots & IRC

    \n\n

    Overview

    \n\n

    Twitch offers an Internet Relay Chat (IRC) interface for chat functionality. Chatbots allow you to interact programmatically with a Twitch chat feed using IRC standards; the bot connects to the Twitch IRC network as a client to perform these actions. This guide presents an easy bot example to get you started, along with next steps for using chatbots and IRC.

    \n\n

    Building the Bot

    \n\n

    We’ll build a simple chatbot that responds in chat when someone types !dice. (This is known as a chatbot command.) When triggered, it randomly generates a number between 1-6. We run the fully-functioning chatbot on Glitch,  and then show how you can alternatively run it locally on your computer. Here’s what the end result looks like:

    \n\n

    \"Screenshot

    \n\n

    Get Environment Variables

    \n\n

    To start, you’ll need three environment variables:

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    VariableDescription
    BOT_USERNAME

    The account (username) that the chatbot uses to send chat messages. This can be your Twitch account. Alternately, many developers choose to create a second Twitch account for their bot, so it's clear from whom the messages originate.

    CHANNEL_NAME

    The Twitch channel name where you want to run the bot. Usually this is your main Twitch account.

    OAUTH_TOKEN

    The token to authenticate your chatbot with Twitch's servers. Generate this with https://twitchapps.com/tmi/ (a Twitch community-driven wrapper around the Twitch API), while logged in to your chatbot account. The token will be an alphanumeric string.

    \n\n

    Run the Chatbot on Glitch

    \n\n

    Glitch lets you instantly create, edit, and host an app in the cloud. The code for this tutorial is live and can be accessed here. Simply put your credentials (the environment variables above) in the .env file and click Run.

    \n\n

    Now that the bot is running and connected to the Twitch IRC network, we can interact with it. On twitch.tv/<CHANNEL_NAME>, type !dice. You’ll see a number from 1 to 6.

    \n\n

    Run the Chatbot Locally

    \n\n

    If you prefer to build and run our bot example locally, follow these steps:

    \n\n
      \n
    1. Install node.js and npm, following the instructions on the links.
    2. \n
    3. On the command line, install tmi.js:
      npm install tmi.js\n
    4. \n
    5. In bot.js below, replace the three environmental variables with the values obtained above.
    6. \n
    7. Run bot.js locally using node:
      node bot.js\n
    8. \n
    9. Now that the bot is running and connected to the Twitch IRC network, we can interact with it. On twitch.tv/<CHANNEL_NAME>, type !dice. You’ll see a number from 1 to 6.
    10. \n
    \n\n

    bot.js

    \n\n
    \n\n

    Next Steps

    \n\n\n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","commands":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Overview
    \n\t\t\n\t\t\t
    CLEARCHAT (Twitch Commands)
    \n\t\t\n\t\t\t
    CLEARMSG (Twitch Commands)
    \n\t\t\n\t\t\t
    HOSTTARGET (Twitch Commands)
    \n\t\t\n\t\t\t
    NOTICE (Twitch Commands)
    \n\t\t\n\t\t\t
    RECONNECT (Twitch Commands)
    \n\t\t\n\t\t\t
    ROOMSTATE (Twitch Commands)
    \n\t\t\n\t\t\t
    USERNOTICE (Twitch Commands)
    \n\t\t\n\t\t\t
    USERSTATE (Twitch Commands)
    \n\t\t\n\t\n\n\n\t\t

    Twitch IRC: Commands

    \n\n

    Overview

    \n\n

    This guide explains the Twitch IRC miscellaneous command capabilities.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CommandDescription
    [CLEARCHAT](#clearchat-twitch-commands)Purges a user’s messages, typically after a user is banned from chat or timed out.
    [CLEARMSG](#clearmsg-twitch-commands)Single message removal on a channel. This is triggered by /delete <target-msg-id> on IRC.
    [HOSTTARGET](#hosttarget-twitch-commands)Channel starts or stops host mode.
    [NOTICE](#notice-twitch-commands)General notices from the server.
    [RECONNECT](#reconnect-twitch-commands)Rejoins channels after a restart.
    [ROOMSTATE](#roomstate-twitch-commands)Identifies the channel’s chat settings (for example, slow mode duration).
    [USERNOTICE](#usernotice-twitch-commands)Announces Twitch-specific events to the channel (for example, a user’s subscription notification).
    [USERSTATE](#userstate-twitch-commands)Identifies a user’s chat settings or properties (for example, chat color).
    \n\n

    CLEARCHAT (Twitch Commands)

    \n\n

    Purge a user’s messages, typically after a user is banned from chat or timed out.

    \n\n

    Prototype:

    \n\n

    > :tmi.twitch.tv CLEARCHAT #<channel> :<user>

    \n\n

    Use with the tags capability; see CLEARCHAT (Twitch Tags), which has additional parameters. If your IRC bot plans to read commands, it must also use the tags capability because most commands are less useful or even meaningless without tags. See CLEARCHAT (Twitch Tags), which has additional parameters.

    \n\n

    Example 1: Clear (delete) all chat on the dallas channel.

    \n\n
    > :tmi.twitch.tv CLEARCHAT #dallas\n
    \n\n

    Example 2: Clear (delete) all chat from a single user on the dallas channel.

    \n\n
    > :tmi.twitch.tv CLEARCHAT #dallas :ronni\n
    \n\n

    CLEARMSG (Twitch Commands)

    \n\n

    Single message removal on a channel. This is triggered by /delete <target-msg-id> on IRC. Use with the tags capability; see CLEARMSG (Twitch Tags).

    \n\n

    Prototype:

    \n\n
    > @login=<login>;target-msg-id=<target-msg-id> :tmi.twitch.tv CLEARMSG #<channel> :<message>\n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterDescription
    loginName of the user who sent the message.
    messageThe message.
    target-msg-idUUID of the message.
    \n\n

    Example: ronni’s HeyGuys message is deleted from the dallas channel.

    \n\n
    > @login=ronni;target-msg-id=abc-123-def :tmi.twitch.tv CLEARMSG #dallas :HeyGuys\n
    \n\n

    HOSTTARGET (Twitch Commands)

    \n\n

    Channel starts or stops host mode.

    \n\n

    Channel starts host mode:

    \n\n

    Prototype:

    \n\n
    > :tmi.twitch.tv HOSTTARGET #hosting_channel :<channel> [<number-of-viewers>]\n
    \n\n

    Channel stops host mode:

    \n\n

    Prototype:

    \n\n
    > :tmi.twitch.tv HOSTTARGET #hosting_channel :- [<number-of-viewers>]\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterDescription
    number-of-viewers(Optional) Number of viewers watching the host. If provided, must be a positive integer.
    \n\n

    NOTICE (Twitch Commands)

    \n\n

    General notices from the server.

    \n\n

    Prototype: 

    \n\n
    > @msg-id=<msg id>:tmi.twitch.tv NOTICE #<channel> :<message>\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterDescription
    messageThe message.
    msg idA message ID string. Can be used for i18ln. Valid values: see Twitch IRC: msg-id Tags.
    \n\n

    Example:

    \n\n
    > @msg-id=slow_off :tmi.twitch.tv NOTICE #dallas :This room is no longer in slow mode.\n
    \n\n

    RECONNECT (Twitch Commands)

    \n\n

    Rejoin channels after a restart.

    \n\n

    Occasionally, Twitch IRC processes need to be restarted. When this happens, clients that have requested  the IRC v3 twitch.tv/commands capability are issued a RECONNECT. After a short time, the connection is closed. In this case, reconnect and rejoin channels that were on the connection, as you would normally.

    \n\n

    ROOMSTATE (Twitch Commands)

    \n\n

    Used when a user joins a channel or a room setting.

    \n\n

    Prototype:

    \n\n
    > :tmi.twitch.tv ROOMSTATE #<channel>\n
    \n\n

    Use with the tags capability; see ROOMSTATE (Twitch Tags), which has additional parameters.

    \n\n

    USERNOTICE (Twitch Commands)

    \n\n

    Announces Twitch-specific events to the channel (for example, a user’s subscription notification).

    \n\n

    Use with the tags capability; see USERNOTICE (Twitch Tags), which has additional parameters.

    \n\n

    Prototype:

    \n\n
    > :tmi.twitch.tv USERNOTICE #<channel> :message\n
    \n\n

    USERSTATE (Twitch Commands)

    \n\n

    Identifies a user’s chat settings or properties (e.g., chat color).

    \n\n

    Use with the tags capability; see USERSTATE (Twitch Tags), which has additional parameters.

    \n\n

    Prototype:

    \n\n
    > :tmi.twitch.tv USERSTATE #<channel>\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","membership":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Overview
    \n\t\t\n\t\t\t
    JOIN (Twitch Membership)
    \n\t\t\n\t\t\t
    PART (Twitch Membership)
    \n\t\t\n\t\n\n\n\t\t

    Twitch IRC: Membership

    \n\n

    Overview

    \n\n

    This guide explains the Twitch IRC channel membership capabilities. 

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CommandDescription
    [JOIN](#join-twitch-membership)Join a channel.
    [PART](#part-twitch-membership)Leave a channel.
    \n\n

    JOIN (Twitch Membership)

    \n\n

    Join a channel.

    \n\n

    Prototype

    \n\n
    > :<user>!<user>@<user>.tmi.twitch.tv JOIN #<channel>\n
    \n\n

    Example: ronni joined the dallas channel.

    \n\n
    > :ronni!ronni@ronni.tmi.twitch.tv JOIN #dallas\n
    \n\n

    PART (Twitch Membership)

    \n\n

    Leave a channel.

    \n\n

    Prototype

    \n\n
    > :<user>!<user>@<user>.tmi.twitch.tv PART #<channel>\n
    \n\n

    Example: ronni left the dallas channel.

    \n\n
    > :ronni!ronni@ronni.tmi.twitch.tv PART #dallas\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","msg-id":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    msg-id Tags for NOTICE
    \n\t\t\n\t\n\n\n\t\t

    Twitch IRC: msg-id Tags

    \n\n

    msg-id Tags for NOTICE

    \n\n

    These tags apply to the NOTICE (Twitch Commands).

    \n\n

    For more information, see the Twitch help portal article on Chat Commands.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    msg-idMessage
    already_banned<user> is already banned in this channel.
    already_emote_only_offThis room is not in emote-only mode.
    already_emote_only_onThis room is already in emote-only mode.
    already_r9k_offThis room is not in r9k mode.
    already_r9k_on

    This room is already in r9k mode.

    already_subs_offThis room is not in subscribers-only mode.
    already_subs_onThis room is already in subscribers-only mode.
    bad_ban_admin

    You cannot ban admin <user>. Please email support@twitch.tv if an admin is being abusive.

    bad_ban_anonYou cannot ban anonymous users.
    bad_ban_broadcasterYou cannot ban the broadcaster.
    bad_ban_global_mod

    You cannot ban global moderator <user>. Please email support@twitch.tv if a global moderator is being abusive.

    bad_ban_modYou cannot ban moderator <user> unless you are the owner of this channel.
    bad_ban_selfYou cannot ban yourself.
    bad_ban_staffYou cannot ban a staff <user>. Please email support@twitch.tv if a staff member is being abusive.
    bad_commercial_error

    Failed to start commercial.

    bad_delete_message_broadcasterYou cannot delete the broadcaster's messages.
    bad_delete_message_modYou cannot delete messages from another moderator <user>.
    bad_host_error

    There was a problem hosting <channel>. Please try again in a minute.

    bad_host_hostingThis channel is already hosting <channel>.
    bad_host_rate_exceededHost target cannot be changed more than <number> times every half hour.
    bad_host_rejected

    This channel is unable to be hosted.

    bad_host_selfA channel cannot host itself.
    bad_marker_clientSorry, /marker is not available through this client.
    bad_mod_banned

    <user> is banned in this channel. You must unban this user before granting mod status.

    bad_mod_mod<user> is already a moderator of this channel.
    bad_slow_durationYou cannot set slow delay to more than <number> seconds.
    bad_timeout_admin

    You cannot timeout admin <user>. Please email support@twitch.tv if an admin is being abusive.

    bad_timeout_anonYou cannot timeout anonymous users.
    bad_timeout_broadcasterYou cannot timeout the broadcaster.
    bad_timeout_duration

    You cannot time a user out for more than <seconds>.

    bad_timeout_global_modYou cannot timeout global moderator <user>. Please email support@twitch.tv if a global moderator is being abusive.
    bad_timeout_modYou cannot timeout moderator <user> unless you are the owner of this channel.
    bad_timeout_self

    You cannot timeout yourself.

    bad_timeout_staffYou cannot timeout staff <user>. Please email support@twitch.tv if a staff member is being abusive.
    bad_unban_no_ban

    <user> is not banned from this channel.

    bad_unhost_errorThere was a problem exiting host mode. Please try again in a minute.
    bad_unmod_mod<user> is not a moderator of this channel.
    ban_success

    <user> is now banned from this channel.

    cmds_availableCommands available to you in this room (use /help <command> for details): <list of commands>
    color_changedYour color has been changed.
    commercial_success

    Initiating <number> second commercial break. Keep in mind that your stream is still live and not everyone will get a commercial.

    delete_message_successThe message from <user> is now deleted.
    emote_only_offThis room is no longer in emote-only mode.
    emote_only_on

    This room is now in emote-only mode.

    followers_off\n

    This room is no longer in followers-only mode.

    \n

    Note: The followers tags are broadcast to a channel when a moderator makes changes.

    \n
    followers_on\n

    This room is now in <duration> followers-only mode.

    \n

    Examples: “This room is now in 2 week followers-only mode.” or “This room is now in 1 minute followers-only mode.”

    \n
    followers_onzero

    This room is now in followers-only mode.

    host_offExited host mode.
    host_onNow hosting <channel>.
    host_success

    <user> is now hosting you.

    host_success_viewers<user> is now hosting you for up to <number> viewers.
    host_target_went_offline

    <channel> has gone offline. Exiting host mode.

    hosts_remaining<number> host commands remaining this half hour.
    invalid_userInvalid username: <user>
    mod_success

    You have added <user> as a moderator of this channel.

    msg_bannedYou are permanently banned from talking in <channel>.
    msg_bad_charactersYour message was not sent because it contained too many characters that could not be processed. If you believe this is an error, rephrase and try again.
    msg_channel_blocked

    Your message was not sent because your account is not in good standing in this channel.

    msg_channel_suspendedThis channel has been suspended.
    msg_duplicateYour message was not sent because it is identical to the previous one you sent, less than 30 seconds ago.
    msg_emoteonlyThis room is in emote only mode. You can find your currently available emoticons using the smiley in the chat text area.
    msg_facebook

    You must use Facebook Connect to send messages to this channel. You can see Facebook Connect in your Twitch settings under the connections tab.

    msg_followersonly\n

    This room is in <duration> followers-only mode. Follow <channel> to join the community!

    \n

    Note: These msg_followers tags are kickbacks to a user who does not meet the criteria; that is, does not follow or has not followed long enough.

    \n
    msg_followersonly_followedThis room is in <duration1> followers-only mode. You have been following for <duration2>. Continue following to chat!
    msg_followersonly_zeroThis room is in followers-only mode. Follow <channel> to join the community!
    msg_r9kThis room is in r9k mode and the message you attempted to send is not unique.
    msg_ratelimitYour message was not sent because you are sending messages too quickly.
    msg_rejectedHey! Your message is being checked by mods and has not been sent.
    msg_rejected_mandatoryYour message wasn't posted due to conflicts with the channel's moderation settings.
    msg_room_not_foundThe room was not found.
    msg_slowmodeThis room is in slow mode and you are sending messages too quickly. You will be able to talk again in <number> seconds.
    msg_subsonlyThis room is in subscribers only mode. To talk, purchase a channel subscription at https://www.twitch.tv/products/<broadcaster login name>/ticket?ref=subscriber_only_mode_chat.
    msg_suspendedYour account has been suspended.
    msg_timedoutYou are banned from talking in <channel> for <number> more seconds.
    msg_verified_emailThis room requires a verified email address to chat. Please verify your email at https://www.twitch.tv/settings/profile.
    no_helpNo help available.
    no_modsThere are no moderators of this channel.
    not_hostingNo channel is currently being hosted.
    no_permissionYou don’t have permission to perform that action.
    r9k_offThis room is no longer in r9k mode.
    r9k_onThis room is now in r9k mode.
    raid_error_already_raidingYou already have a raid in progress.
    raid_error_forbiddenYou cannot raid this channel.
    raid_error_selfA channel cannot raid itself.
    raid_error_too_many_viewersSorry, you have more viewers than the maximum currently supported by raids right now.
    raid_error_unexpectedThere was a problem raiding <channel>. Please try again in a minute.
    raid_notice_matureThis channel is intended for mature audiences.
    raid_notice_restricted_chatThis channel has follower or subscriber only chat.
    room_modsThe moderators of this channel are: <list of users>
    slow_offThis room is no longer in slow mode.
    slow_onThis room is now in slow mode. You may send messages every <number> seconds.
    subs_offThis room is no longer in subscribers-only mode.
    subs_onThis room is now in subscribers-only mode.
    timeout_no_timeout<user> is not timed out from this channel.
    timeout_success<user> has been timed out for <duration> seconds.
    tos_banThe community has closed channel <channel> due to Terms of Service violations.
    turbo_only_colorOnly turbo users can specify an arbitrary hex color. Use one of the following instead: <list of colors>.
    unban_success<user> is no longer banned from this channel.
    unmod_successYou have removed <user> as a moderator of this channel.
    unraid_error_no_active_raidYou do not have an active raid.
    unraid_error_unexpectedThere was a problem stopping the raid. Please try again in a minute.
    unraid_successThe raid has been cancelled.
    unrecognized_cmdUnrecognized command: <command>
    unsupported_chatrooms_cmdThe command <command> cannot be used in a chatroom.
    untimeout_banned<user> is permanently banned. Use \"/unban\" to remove a ban.
    untimeout_success<user> is no longer timed out in this channel.
    usage_banUsage: “/ban <username> [reason]” Permanently prevent a user from chatting. Reason is optional and will be shown to the target and other moderators. Use “/unban” to remove a ban.
    usage_clearUsage: “/clear”
    Clear chat history for all users in this room.
    usage_colorUsage: “/color” <color>
    Change your username color. Color must be in hex (#000000) or one of the following: Blue, BlueViolet, CadetBlue, Chocolate, Coral, DodgerBlue, Firebrick, GoldenRod, Green, HotPink, OrangeRed, Red, SeaGreen, SpringGreen, YellowGreen.
    usage_commercialUsage: “/commercial [length]”
    Triggers a commercial. Length (optional) must be a positive number of seconds.
    usage_disconnectUsage: “/disconnect”
    Reconnects to chat.
    usage_emote_only_offUsage: /emoteonlyoff”
    Disables emote-only mode.
    usage_emote_only_onUsage: “/emoteonly”
    Enables emote-only mode (only emoticons may be used in chat). Use /emoteonlyoff to disable.
    usage_followers_offUsage: /followersoff”
    Disables followers-only mode.
    usage_followers_onUsage: “/followers
    Enables followers-only mode (only users who have followed for “duration” may chat). Examples: “30m”, “1 week”, “5 days 12 hours”. Must be less than 3 months.
    usage_helpUsage: “/help”
    Lists the commands available to you in this room.
    usage_hostUsage: “/host <channel>”
    Host another channel. Use “/unhost” to unset host mode.
    usage_markerUsage: “/marker <optional comment>”
    Adds a stream marker (with an optional comment, max 140 characters) at the current timestamp. You can use markers in the Highlighter for easier editing.
    usage_meUsage: “/me <message>”
    Send an “emote” message in the third person.
    usage_modUsage: “/mod <username>”
    Grant mod status to a user. Use “/mods” to list the moderators of this channel.
    usage_modsUsage: “/mods”
    Lists the moderators of this channel.
    usage_r9k_offUsage: “/r9kbetaoff”
    Disables r9k mode.
    usage_r9k_onUsage: “/r9kbeta”
    Enables r9k mode.
    Use “/r9kbetaoff“ to disable.
    usage_raidUsage: “/raid <channel>”
    Raid another channel.
    Use “/unraid” to cancel the Raid.
    usage_slow_offUsage: “/slowoff”
    Disables slow mode.
    usage_slow_onUsage: “/slow” [duration]
    Enables slow mode (limit how often users may send messages). Duration (optional, default=<number>) must be a positive integer number of seconds.
    Use “/slowoff” to disable.
    usage_subs_offUsage: “/subscribersoff”
    Disables subscribers-only mode.
    usage_subs_onUsage: “/subscribers”
    Enables subscribers-only mode (only subscribers may chat in this channel).
    Use “/subscribersoff” to disable.
    usage_timeoutUsage: “/timeout <username> [duration][time unit] [reason]\"
    Temporarily prevent a user from chatting. Duration (optional, default=10 minutes) must be a positive integer; time unit (optional, default=s) must be one of s, m, h, d, w; maximum duration is 2 weeks. Combinations like 1d2h are also allowed. Reason is optional and will be shown to the target user and other moderators.
    Use “untimeout” to remove a timeout.
    usage_unbanUsage: “/unban <username>”
    Removes a ban on a user.
    usage_unhostUsage: “/unhost”
    Stop hosting another channel.
    usage_unmodUsage: “/unmod <username>”
    Revoke mod status from a user. Use “/mods” to list the moderators of this channel.
    usage_unraidUsage: “/unraid”
    Cancel the Raid.
    usage_untimeoutUsage: “/untimeout <username>”
    Removes a timeout on a user.
    whisper_bannedYou have been banned from sending whispers.
    whisper_banned_recipientThat user has been banned from receiving whispers.
    whisper_invalid_argsUsage: <login> <message>
    whisper_invalid_loginNo user matching that login.
    whisper_invalid_selfYou cannot whisper to yourself.
    whisper_limit_per_minYou are sending whispers too fast. Try again in a minute.
    whisper_limit_per_secYou are sending whispers too fast. Try again in a second.
    whisper_restrictedYour settings prevent you from sending this whisper.
    whisper_restricted_recipientThat user's settings prevent them from receiving this whisper.
    \n\n

     

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","tags":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Overview
    \n\t\t\n\t\t\t
    CLEARCHAT (Twitch Tags)
    \n\t\t\n\t\t\t
    CLEARMSG (Twitch Tags)
    \n\t\t\n\t\t\t
    GLOBALUSERSTATE (Twitch Tags)
    \n\t\t\n\t\t\t
    PRIVMSG (Twitch Tags)
    \n\t\t\n\t\t\t
    ROOMSTATE (Twitch Tags)
    \n\t\t\n\t\t\t
    USERNOTICE (Twitch Tags)
    \n\t\t\n\t\t\t
    USERSTATE (Twitch Tags)
    \n\t\t\n\t\n\n\n\t\t

    Twitch IRC: Tags

    \n\n

    Overview

    \n\n

    As stated in the IRCv3 Message Tag specification, “Message tags are a mechanism for adding additional metadata on a per-message basis. This is achieved via an extension to the protocol message format, enabled via capability negotiation. Tags are simple keys that MAY have optional string data as values.Tagged messages can be sent by both servers and clients. The usage of individual tags [is] specified in their own documents.”

    \n\n

    In other words, tags are optional metadata which Twitch can attach to an IRC message. When a client requests the tags capability, the EBS adds one or more tags to each message to that client.

    \n\n

    This guide documents the tags and values supported by Twitch IRC. If a tag is not documented here, it is not supported.

    \n\n

    Here is the general format for an individual tag:
    > @tag-name=<tag-name> :tmi.twitch.tv <command> #<channel> :<user>

    \n\n

    Here is the general format for a set of tags:
    @tag-name-1=<tag-value-1>;tag-name-2=<tag-value-2>;... <rest of the command syntax depends on the particular IRC command used>

    \n\n

    Tags may appear in any order. Write your code to parse tags individually and ignore unrecognized tags. 

    \n\n

    As noted in the following table, some tags are deprecated. 

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    CommandDescription
    CLEARCHATPurges all chat messages in a channel, or purges chat messages from a specific user, typically after a timeout or ban.
    CLEARMSGRemoves a single message from a channel. This is triggered by /delete <target-msg-id> on IRC.
    GLOBALUSERSTATEOn successful login, provides data about the current logged-in user through IRC tags. It is sent after successfully authenticating (sending a PASS/NICK command).
    PRIVMSGSends a message to a channel.
    ROOMSTATESends room-state data when a user joins a channel or a room setting is changed. For a join, the message contains all chat-room settings. For changes, only the relevant tag is sent.
    USERNOTICESends a notice to the user when any of several events occurs.
    USERSTATESends user-state data when a user joins a channel or sends a PRIVMSG to a channel.
    \n\n

    CLEARCHAT (Twitch Tags)

    \n\n

    Purges all chat messages in a channel, or purges chat messages from a specific user, typically after a timeout or ban.

    \n\n

    Prototype:

    \n\n
    > @ban-duration=<ban-duration> :tmi.twitch.tv CLEARCHAT #<channel> :<user>\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterDescription
    ban-duration(Optional) Duration of the timeout, in seconds. If omitted, the ban is permanent.
    \n\n

    Example: ronni is permanently banned from the dallas channel.

    \n\n
    > :tmi.twitch.tv CLEARCHAT #dallas :ronni\n
    \n\n

    CLEARMSG (Twitch Tags)

    \n\n

    Removes a single message from a channel. This is triggered by the/delete <target-msg-id> command on IRC.

    \n\n

    Prototype:

    \n\n
    > @login=<login>;target-msg-id=<target-msg-id> :tmi.twitch.tv CLEARMSG #<channel> :<message>\n
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterDescription
    loginName of the user who sent the message.
    messageThe message.
    target-msg-idUUID of the message.
    \n\n

    Example: ronni’s HeyGuys message is deleted from the dallas channel.

    \n\n
    > @login=ronni;target-msg-id=abc-123-def :tmi.twitch.tv CLEARMSG #dallas :HeyGuys\n
    \n\n

    GLOBALUSERSTATE (Twitch Tags)

    \n\n

    On successful login, provides data about the current logged-in user through IRC tags. It is sent after successfully authenticating (sending a PASS/NICK command).

    \n\n

    Prototype:
    > @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emote-sets=<emote-sets>;turbo=<turbo>;user-id=<user-id>;user-type=<user-type> :tmi.twitch.tv GLOBALUSERSTATE

    \n\n

    Note: Before doing this, you must request and receive the tags capability:
    < CAP REQ :twitch.tv/tags
    > :tmi.twitch.tv CAP * ACK :twitch.tv/tags

    \n\n

    For more information, see Twitch IRC Capabilities.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterDescription
    badge-infoMetadata related to the chat badges in the badges tag.

    Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.
    badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
    colorHexadecimal RGB color code; the empty string if it is never set.
    display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
    emote-setsA comma-separated list of emotes, belonging to one or more emote sets. This always contains at least 0. Get Chat Emoticons by Set gets a subset of emoticons.
    turbo(Deprecated, use badges instead) 1 if the user has a Turbo badge; otherwise, 0.
    user-idThe user’s ID.
    user-type(Deprecated, use badges instead) The user’s type. Valid values: empty, mod, global_mod, admin, staff. The broadcaster can have any of these.
    \n\n

    Example: This is the global user state of dallas, an admin user, after logging in.

    \n\n
    > @badge-info=subscriber/8;badges=subscriber/6;color=#0D4200;display-name=dallas;emote-sets=0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239;turbo=0;user-id=1337;user-type=admin :tmi.twitch.tv GLOBALUSERSTATE\n
    \n\n

    PRIVMSG (Twitch Tags)

    \n\n

    Sends a message to a channel. 

    \n\n

    Prototype:

    \n\n
    > @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emotes=<emotes>;id=<id-of-msg>;mod=<mod>;room-id=<room-id>;subscriber=<subscriber>;tmi-sent-ts=<timestamp>;turbo=<turbo>;user-id=<user-id>;user-type=<user-type> :<user>!<user>@<user>.tmi.twitch.tv PRIVMSG #<channel> :<message>\n
    \n\n

    All PRIVMSGs contain the fields listed in the preceding prototype. In addition, the bits field is sent for Bits messages. To learn more about Bits, see the Extensions Monetization Guide

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterDescription
    badge-info\n

    Metadata related to the chat badges in the badges tag.

    \n

    Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.

    \n
    badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
    bitsSent only for Bits messages. The amount of cheer/Bits employed by the user. All instancess follow the regular expression:
    /(^\\|\\s)<emote-name>\\d+(\\s\\|$)/
    (where <emote-name> is an emote name returned by the Get Cheermotes endpoint), should be replaced with the appropriate emote:
    static-cdn.jtvnw.net/bits/<theme>/<type>/<color>/<size>
      \n
    • \nthemelight or dark\n
    • \n
    • \ntypeanimated or static\n
    • \n
    • \ncolorred for 10000+ Bits, blue for 5000-9999, green for 1000-4999, purple for 100-999, gray for 1-99
    • \n
    • \nsize – A digit between 1 and 4
    • \n
    \n
    colorHexadecimal RGB color code; the empty string if it is never set.
    display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
    emotesInformation to replace text in the message with emote images. This can be empty. Syntax:
    <emote ID>:<first index>-<last index>,<another first index>-<another last index>/<another emote ID>:<first index>-<last index>...
      \n
    • \nemote ID – The number to use in this URL:
      http://static-cdn.jtvnw.net/emoticons/v1/:<emote ID>/:<size>
      (size is 1.0, 2.0 or 3.0.)
    • \n
    • \nfirst index, last index – Character indexes. \\001ACTION does not count. Indexing starts from the first character that is part of the user’s actual message. See the example (normal message) below.
    • \n
    \n
    idA unique ID for the message.
    messageThe message.
    mod1 if the user has a moderator badge; otherwise, 0.
    room-idThe channel ID.
    subscriberDeprecated, use badges 
    1 if the user has a subscriber badge; otherwise, 0.
    tmi-sent-tsTimestamp when the server received the message.
    turboDeprecated, use badges 
    1 if the user has a Turbo badge; otherwise, 0.
    user-idThe user’s ID.
    user-typeDeprecated, use badges 
    The user’s type. Valid values: mod, global_mod, admin, staff. If the broadcaster is not any of these user types, this field is left empty.
    \n\n

    Example of a non-Bits message: The first Kappa (emote ID 25) is from character 0 (K) to character 4 (a), and the other Kappa is from 12 to 16.

    \n\n
    > @badge-info=;badges=global_mod/1,turbo/1;color=#0D4200;display-name=ronni;emotes=25:0-4,12-16/1902:6-10;id=b34ccfc7-4977-403a-8a94-33c6bac34fb8;mod=0;room-id=1337;subscriber=0;tmi-sent-ts=1507246572675;turbo=1;user-id=1337;user-type=global_mod :ronni!ronni@ronni.tmi.twitch.tv PRIVMSG #ronni :Kappa Keepo Kappa\n
    \n\n

    Example of a Bits message: 

    \n\n
    > @badge-info=;badges=staff/1,bits/1000;bits=100;color=;display-name=ronni;emotes=;id=b34ccfc7-4977-403a-8a94-33c6bac34fb8;mod=0;room-id=1337;subscriber=0;tmi-sent-ts=1507246572675;turbo=1;user-id=1337;user-type=staff :ronni!ronni@ronni.tmi.twitch.tv PRIVMSG #ronni :cheer100\n
    \n\n

    ROOMSTATE (Twitch Tags)

    \n\n

    Sends room-state data when a user joins a channel or a room setting is changed. For a join, the message contains all chat-room settings. For changes, only the relevant tag is sent.

    \n\n

    Prototype:

    \n\n
    > @emote-only=<emote-only>;followers-only=<followers-only>;r9k=<r9k>;slow=<slow>;subs-only=<subs-only> :tmi.twitch.tv ROOMSTATE #<channel>\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterDescription
    emote-onlyEmote-only mode.
    If enabled, only emotes are allowed in chat. Valid values: 0 (disabled) or 1 (enabled).
    followers-onlyFollowers-only mode.
    If enabled, controls which followers can chat. Valid values: -1 (disabled), 0 (all followers can chat), or a non-negative integer (only users following for at least the specified number of minutes can chat).
    r9kR9K mode.
    If enabled, messages with more than 9 characters must be unique. Valid values: 0 (disabled) or 1 (enabled).
    slowThe number of seconds a chatter without moderator privileges must wait between sending messages.
    subs-onlySubscribers-only mode.
    If enabled, only subscribers and moderators can chat. Valid values: 0 (disabled) or 1 (enabled).
    \n\n

    Example: This is for a join in the dallas channel.

    \n\n
    > @emote-only=0;followers-only=0;r9k=0;slow=0;subs-only=0 :tmi.twitch.tv ROOMSTATE #dallas\n
    \n\n

    Example: On the dallas channel, slow mode is set to 10 seconds:

    \n\n
    > @slow=10 :tmi.twitch.tv ROOMSTATE #dallas\n
    \n\n

    USERNOTICE (Twitch Tags)

    \n\n

    Sends a notice to the user when any of the following events occurs:

    \n\n
      \n
    • Subscription, resubscription, or gift subscription to a channel.
    • \n
    • Incoming raid to a channel. Raid is a Twitch tool that allows broadcasters to send their viewers to another channel, to help support and grow other members in the community.
    • \n
    • Channel ritual. Many channels have special rituals to celebrate viewer milestones when they are shared. The rituals notice extends the sharing of these messages to other viewer milestones, for example, a new viewer chatting for the first time.
    • \n
    \n\n

    Prototype:

    \n\n
    > @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emotes=<emotes>;id=<id-of-msg>;login=<user>;mod=<mod>;msg-id=<msg-id>;room-id=<room-id>;subscriber=<subscriber>;system-msg=<system-msg>;tmi-sent-ts=<timestamp>;turbo=<turbo>;user-id=<user-id>;user-type=<user-type> :tmi.twitch.tv USERNOTICE #<channel> :<message>\n
    \n\n

    All USERNOTICEs contain the fields listed in the preceding prototype.

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ParameterDescription
    badge-info\n

    Metadata related to the chat badges in the badges tag.

    \n

    Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.

    \n
    badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
    colorHexadecimal RGB color code; the empty string if it is never set.
    display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
    emotesInformation to replace text in the message with emote images. This can be empty. Syntax:
    <emote ID>:<first index>-<last index>,<another first index>-<another last index>/<another emote ID>:<first index>-<last index>...
      \n
    • \nemote ID – The number to use in this URL:
      http://static-cdn.jtvnw.net/emoticons/v1/:<emote ID>/:<size>
      (size is 1.0, 2.0 or 3.0.)\n
    • \n
    • \nfirst index, last index – Character indexes. \\001ACTION does not count. Indexing starts from the first character that is part of the user’s actual message. See the example (normal message) below.
    • \n
    \n
    idA unique ID for the message.
    loginThe name of the user who sent the notice.
    messageThe message.
    This is omitted if the user did not enter a message.
    mod1 if the user has a moderator badge; otherwise, 0.
    msg-idThe type of notice (not the ID). Valid values: sub, resub, subgift, anonsubgift, submysterygift, giftpaidupgraderewardgift, anongiftpaidupgrade, raid, unraid, ritual, bitsbadgetier.\n
    room-idThe channel ID.
    subscriber(Deprecated, use badges)
    1 if the user has a subscriber badge; otherwise, 0.
    system-msgThe message printed in chat along with this notice.
    tmi-sent-tsTimestamp when the server received the message.
    turbo

    (Deprecated, use badges)
    1 if the user has a Turbo badge; otherwise, 0.

    user-idThe user’s ID.
    user-type(Deprecated, use badges)
    The user’s type. Valid values: mod, global_mod, admin, staff. If the broadcaster is not any of these user types, this field is left empty.
    \n\n

    Several other, msg-param fields are sent only for some notices; e.g., sub/resub. See the table below for details.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    msg-param ParameterDescription
    \nmsg-param-cumulative-months\nSent only on sub, resub
    The total number of months the user has subscribed. This is the same as msg-param-months but sent for different types of user notices.
    msg-param-displayNameSent only on raid
    The display name of the source user raiding this channel.
    msg-param-loginSent on only raid
    The name of the source user raiding this channel.
    msg-param-monthsSent only on subgift, anonsubgift
    The total number of months the user has subscribed. This is the same as msg-param-cumulative-months but sent for different types of user notices.
    msg-param-promo-gift-totalSent only on anongiftpaidupgrade, giftpaidupgrade
    The number of gifts the gifter has given during the promo indicated by msg-param-promo-name.
    msg-param-promo-nameSent only on anongiftpaidupgrade, giftpaidupgrade
    The subscriptions promo, if any, that is ongoing; e.g. Subtember 2018.
    msg-param-recipient-display-nameSent only on subgift, anonsubgift
    The display name of the subscription gift recipient.
    msg-param-recipient-idSent only on subgift, anonsubgift
    The user ID of the subscription gift recipient.
    msg-param-recipient-user-nameSent only on subgift, anonsubgift
    The user name of the subscription gift recipient.
    msg-param-sender-loginSent only on giftpaidupgrade
    The login of the user who gifted the subscription.
    msg-param-sender-nameSent only on giftpaidupgrade
    The display name of the user who gifted the subscription.
    msg-param-should-share-streakSent only on sub, resub
    Boolean indicating whether users want their streaks to be shared.
    msg-param-streak-monthsSent only on sub, resub
    The number of consecutive months the user has subscribed. This is 0 if msg-param-should-share-streak is 0.
    msg-param-sub-plan(Sent only on subresub, subgift, anonsubgift) The type of subscription plan being used. Valid values: Prime, 1000, 2000, 3000. 1000, 2000, and 3000 refer to the first, second, and third levels of paid subscriptions, respectively (currently $4.99, $9.99, and $24.99).
    msg-param-sub-plan-nameSent only on subresub, subgift, anonsubgift
    The display name of the subscription plan. This may be a default name or one created by the channel owner.
    msg-param-viewerCountSent only on raid
    The number of viewers watching the source channel raiding this channel.
    msg-param-ritual-nameSent only on ritual
    The name of the ritual this notice is for. Valid value: new_chatter.
    msg-param-thresholdSent only on bitsbadgetier
    The tier of the bits badge the user just earned; e.g. 100, 1000, 10000.
    msg-param-gift-monthsSent only on subgift, anonsubgift
    Number of months gifted as part of a single, multi-month gift.
    \n\n

    Example: Notice sent when ronni resubscribed to the dallas channel.

    \n\n
    > @badge-info=;badges=staff/1,broadcaster/1,turbo/1;color=#008000;display-name=ronni;emotes=;id=db25007f-7a18-43eb-9379-80131e44d633;login=ronni;mod=0;msg-id=resub;msg-param-cumulative-months=6;msg-param-streak-months=2;msg-param-should-share-streak=1;msg-param-sub-plan=Prime;msg-param-sub-plan-name=Prime;room-id=1337;subscriber=1;system-msg=ronni\\shas\\ssubscribed\\sfor\\s6\\smonths!;tmi-sent-ts=1507246572675;turbo=1;user-id=1337;user-type=staff :tmi.twitch.tv USERNOTICE #dallas :Great stream -- keep it up!\n
    \n\n

    Example: Notice sent when tww2 gifted a subscription to Mr_Woodchuck in forstycup’s channel.

    \n\n
    > @badge-info=;badges=staff/1,premium/1;color=#0000FF;display-name=TWW2;emotes=;id=e9176cd8-5e22-4684-ad40-ce53c2561c5e;login=tww2;mod=0;msg-id=subgift;msg-param-months=1;msg-param-recipient-display-name=Mr_Woodchuck;msg-param-recipient-id=89614178;msg-param-recipient-name=mr_woodchuck;msg-param-sub-plan-name=House\\sof\\sNyoro~n;msg-param-sub-plan=1000;room-id=19571752;subscriber=0;system-msg=TWW2\\sgifted\\sa\\sTier\\s1\\ssub\\sto\\sMr_Woodchuck!;tmi-sent-ts=1521159445153;turbo=0;user-id=13405587;user-type=staff :tmi.twitch.tv USERNOTICE #forstycup\n
    \n\n

    Example: Notice sent when an anonymous user gifted a subscription to TenureCalculator in qa_subs_partner’s channel. This is like the “subgift” message above, except:

    \n\n
      \n
    • The sender of the user-notice is the channel.
    • \n
    • The sender-count of the user-notice is hidden.
    • \n
    \n\n
    > @badge-info=;badges=broadcaster/1,subscriber/6;color=;display-name=qa_subs_partner;emotes=;flags=;id=b1818e3c-0005-490f-ad0a-804957ddd760;login=qa_subs_partner;mod=0;msg-id=anonsubgift;msg-param-months=3;msg-param-recipient-display-name=TenureCalculator;msg-param-recipient-id=135054130;msg-param-recipient-user-name=tenurecalculator;msg-param-sub-plan-name=t111;msg-param-sub-plan=1000;room-id=196450059;subscriber=1;system-msg=An\\sanonymous\\suser\\sgifted\\sa\\sTier\\s1\\ssub\\sto\\sTenureCalculator!\\s;tmi-sent-ts=1542063432068;turbo=0;user-id=196450059;user-type= :tmi.twitch.tv USERNOTICE #qa_subs_partner\n
    \n\n

    Example: Notice sent when a channel is raided.

    \n\n
    > @badge-info=;badges=turbo/1;color=#9ACD32;display-name=TestChannel;emotes=;id=3d830f12-795c-447d-af3c-ea05e40fbddb;login=testchannel;mod=0;msg-id=raid;msg-param-displayName=TestChannel;msg-param-login=testchannel;msg-param-viewerCount=15;room-id=56379257;subscriber=0;system-msg=15\\sraiders\\sfrom\\sTestChannel\\shave\\sjoined\\n!;tmi-sent-ts=1507246572675;tmi-sent-ts=1507246572675;turbo=1;user-id=123456;user-type= :tmi.twitch.tv USERNOTICE #othertestchannel\n
    \n\n

    Example: Notice sent for a new_chatter ritual.

    \n\n
    > @badge-info=;badges=;color=;display-name=SevenTest1;emotes=30259:0-6;id=37feed0f-b9c7-4c3a-b475-21c6c6d21c3d;login=seventest1;mod=0;msg-id=ritual;msg-param-ritual-name=new_chatter;room-id=6316121;subscriber=0;system-msg=Seventoes\\sis\\snew\\shere!;tmi-sent-ts=1508363903826;turbo=0;user-id=131260580;user-type= :tmi.twitch.tv USERNOTICE #seventoes :HeyGuys\n
    \n\n

    USERSTATE (Twitch Tags)

    \n\n

    Sends user-state data when a user joins a channel or sends a PRIVMSG to a channel.

    \n\n

    Prototype:

    \n\n
    > @badge-info=<badge-info>;badges=<badges>;color=<color>;display-name=<display-name>;emote-sets=<emote-sets>;mod=<mod>;subscriber=<subscriber>;turbo=<turbo>;user-type=<user-type>:tmi.twitch.tv USERSTATE #<channel>\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterDescription
    badge-infoMetadata related to the chat badges in the badges tag.

    Currently this is used only for subscriber, to indicate the exact number of months the user has been a subscriber. This number is finer grained than the version number in badges. For example, a user who has been a subscriber for 45 months would have a badge-info value of 45 but might have a badges version number for only 3 years.
    badgesComma-separated list of chat badges and the version of each badge (each in the format <badge>/<version>, such as admin/1). There are many valid badge values; e.g., admin, bits, broadcaster, global_mod, moderator, subscriber, staff, turbo. Many badges have only 1 version, but some badges have different versions (images), depending on how long you hold the badge status; e.g., subscriber.
    colorHexadecimal RGB color code; the empty string if it is never set.
    display-nameThe user’s display name, escaped as described in the IRCv3 spec. This is empty if it is never set.
    emote-setsYour emote set, a comma-separated list of emote sets. Get Chat Emoticons by Set gets a subset of emoticon images.
    mod1 if the user has a moderator badge; otherwise, 0.
    subscriber(Deprecated, use badges)
    1 if the user has a subscriber badge; otherwise, 0.
    turbo(Deprecated, use badges)
    1 if the user has a Turbo badge; otherwise, 0.
    user-type(Deprecated, use badges 
    The user’s type. Valid values: empty, mod, global_mod, admin, staff. The broadcaster can have any of these.
    \n\n

    Example: Notice sent when ronni joins the dallas channel.

    \n\n
    > @badge-info=;badges=staff/1;color=#0D4200;display-name=ronni;emote-sets=0,33,50,237,793,2126,3517,4578,5569,9400,10337,12239;mod=1;subscriber=1;turbo=1;user-type=staff :tmi.twitch.tv USERSTATE #dallas\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","mobile-deeplinks":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Checking Whether the Twitch App is Installed
    \n\t\t\n\t\t\t
    Deep Link Formats
    \n\t\t\n\t\n\n\n\t\t

    Mobile Deep Links

    \n\n

    Introduction

    \n\n

    Deep links allow third party mobile apps and mobile web sites to bring users to a specific place within a Twitch app. This guide explains how to check whether the Twitch App is installed and describes deep link formats.

    \n\n

    Deep links are important because they allow tighter integration with Twitch on mobile apps. For example, an app that helps a broadcaster manage his channel could link directly to the user’s dashboard within the Twitch App (as opposed to just launching the app and leaving the user on the “Following” tab).

    \n\n

    You can find more information about deep links here. For support, visit the Twitch Developer Forums.

    \n\n

    Checking Whether the Twitch App is Installed

    \n\n

    You can check whether the Twitch App is already installed on a mobile device as follows:

    \n\n

    On iOS Objective C

    \n\n
    NSURL *twitchURL = [NSURL URLWithString:@\"twitch://open\"];\nif ([[UIApplication sharedApplication] canOpenURL:twitchURL]) {\n    // The Twitch app is installed, do whatever logic you need, and call -openURL:\n} else {\n    // The Twitch app is not installed. Prompt the user to install it!\n}\n
    \n\n

    On iOS Swift

    \n\n

    let twitchURL = NSURL(string: \"twitch://open\")
    if (UIApplication.sharedApplication().canOpenURL(twitchURL!)) {
        // The Twitch app is installed, do whatever logic you need, and call -openURL:
    } else {
        // The Twitch app is not installed. Prompt the user to install it!
    }

    \n\n

    Note: On both iOS platforms, you also must change your app’s Info.plist file to declare that your app is allowed to query the twitch scheme. See the Apple documentation for detailed information. 

    \n\n

    On Android

    \n\n
    // Where “packagename” is the package name of the Twitch app:\nprivate boolean isPackageInstalled(String packagename, Context context) {\n    PackageManager pm = context.getPackageManager();\n    try {\n        pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);\n        return true;\n    } catch (NameNotFoundException e) {\n        return false;\n    }\n}\n
    \n\n\n\n

    To launch the Twitch App, use twitch://open.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    To launch the Twitch App and…Use this URL
    Navigate to a specific channel\ntwitch://stream/<channel name>
    – OR –
    twitch://open?stream=<channel name>\n
    Open a specific game directory\ntwitch://game/<game name>
    – OR –
    twitch://open?game=<game name>\n
    Open a specific VOD\ntwitch://video/<video ID>
    – OR –
    twitch://open?video=<video ID>

    For a VOD with this URL:
    twitch.tv/some_channel/v/1234567
    the video_id is v1234567.
    Open a specific channel activity feed (includes VODs)\ntwitch://channel/<channel name>
    – OR –
    twitch://open?channel=<channel name>\n
    Open the user’s “following” directory
    (first tab in the app)
    \ntwitch://following
    If the user is not logged in, this goes to the login page
    Open the login pagetwitch://login
    Open a specific chat roomtwitch://<channel name>/rooms/<room name>
    View a specific Category tagtwitch://directory/tags/<tag ID>
    Open a specific live-stream tagtwitch://directory/all/tags/<tag ID>
    Broadcast a specific gametwitch://broadcast?game_id=<game ID>
    \n\n

     

    \n\n


     

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","petstore":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Making Requests
    \n\t\t\n\t\t\t
    References
    \n\t\t\n\t\n\n\n\t\t

    Petstore API

    \n\n

    The references under this section have been automatically generated from the OpenAPI spec located at _data/petstore.json.

    \n\n

    Introduction

    \n\n

    Welcome to our new API!

    \n\n

    Making Requests

    \n\n

    This is another placeholder section just to demonstrate the generated left-hand navigation.

    \n\n

    References

    \n\n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","product-lifecycle":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\n\n\t\t

    Product Lifecycle

    \n\n

    This page provides the current lifecycle status of our developer products and services. For real-time availability and latency status, see devstatus.twitch.tv.

    \n\n

    Important Dates

    \n\n
      \n
    • February 21, 2021: With a newer version available, Legacy Drops will be decommissioned. Read more\n
    • \n
    \n\n

    API Endpoint and Subscription Classifications

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    TagDescription
    NEWFunctionality that has been recenty released.
    BETAFunctionality that is considered to be in public beta and not intended for use in production environments. All aspects of this functionality including query parameters and response structure are subject to change without notice. While exploring this functionality, please provide your feedback in the UserVoice Developer Forum.
    \n\n

    Product Status Definitions

    \n\n

    Developer products and services can be in one of the three statuses. This table provides context for the availability of a product or service given its current status.

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    StatusAvailabilityMaintenanceNotification
    ActiveLive in production.Actively maintained with bug and security fixes. New features may be added.An announcement is posted when a new product or product feature is available. Changelog is updated.
    DeprecatedLive in production.Only major bug and security fixes are made. New features are not added.An announcement is posted when a product or product feature is deprecated. Direct emails may be sent to developers. Changelog is updated. Decommission and shutdown plan will be announced at time of deprecation or at a later date.
    DecommissionedNo longer available in production.Service is no longer maintained.Previous announcements may be updated. Further announcements and emails are possible.
    \n\n

    Current Product Status

    \n\n

    Active

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ProductRelated Announcements
    Authentication: OIDC tokens 
    Authentication: User access tokens 
    Authentication: App access tokens 
    Chat (IRC) 
    DropsRead more about the latest version
    Embedding Twitch: EverythingSee 2020 updates
    Embedding Twitch: ChatSee 2020 updates
    Embedding Twitch: Video & ClipsSee 2020 updates
    Extensions 
    Insights & Analytics 
    Mobile Deep Links 
    Pubsub 
    Twitch API: HelixOAuth requirements
    \n\n

    Deprecated

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ProductNote
    Twitch API: v5 
    Legacy DropsDrops campaigns that use VHS endpoints. Read more in the announcement.
    \n\n

    Decommissioned

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ProductNote
    Chat roomsDecommissioned in January 2020
    Twitch API: v3Decommissioned on September 12, 2019
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","pubsub":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Terminology
    \n\t\t\n\t\t\t
    Connection Management
    \n\t\t\n\t\t\t
    API Limits
    \n\t\t\n\t\t\t
    Topics
    \n\t\t\n\t\t\t
    Receiving Messages
    \n\t\t\n\t\n\n\n\t\t

    PubSub Guide

    \n\n

    Introduction

    \n\n

    PubSub enables you to subscribe to a topic, for updates (e.g., when a user cheers in a channel).

    \n\n

    The Twitch PubSub system allows back-end services to broadcast realtime messages to clients. Example applications include:

    \n\n
      \n
    • An instant messaging service sending instant messages between friends.
    • \n
    • A back-end video system pushing real-time viewer count updates to video players.
    • \n
    • A presence system broadcasting users’ online status to all their friends.
    • \n
    \n\n

    These example applications share a common pattern: on application load, the application fetches a complete snapshot of its state and uses a PubSub connection to receive updates to this state. The updates act as “diffs” to the initial state.

    \n\n

    Clients establish a WebSocket connection to our server, listen on topics they care about, and get messages on those topics in real time. Each command or message sent between the client and server is a JSON string encapsulated in one WebSocket frame.

    \n\n

    WebSocket is a communications protocol, providing full-duplex communication channels over a single TCP connection. For more information, see the WebSocket Wikipedia entry.

    \n\n

    The JSON messages differ, depending on the type of message or command, but typically they have this form:

    \n\n
    {\n   \"type\": \"<type string>\",\n   \"data\": \"<JSON blob>\"\n}\n
    \n\n

    A code sample is available for JavaScript.

    \n\n

    Terminology

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    TermDefinition
    ClientAn end-user session of the Twitch application or a third-party application’s integration point.
    CommandAn action that a client issues to the server, which modifies the state of the client connection.
    MessageA piece of data which back-end services broadcast to interested clients via PubSub. PubSub never inspects or mutates messages.
    ServerA Twitch machine that clients connect to for PubSub service.
    TopicAka event. A logical partition of messages that clients may subscribe to, to get messages.
    \n\n

    Connection Management

    \n\n

    Clients establish a secure WebSocket connection to:

    \n\n

    wss://pubsub-edge.twitch.tv

    \n\n

    To keep the server from closing the connection, clients must send a PING command at least once every 5 minutes. If a client does not receive a PONG message within 10 seconds of issuing a PING command, it should reconnect to the server. See details in Handling Connection Failures.

    \n\n

    Clients must LISTEN on at least one topic within 15 seconds of establishing the connection, or they will be disconnected by the server.

    \n\n

    Clients may receive a RECONNECT message at any time. This indicates that the server is about to restart (typically for maintenance) and will disconnect the client within 30 seconds. During this time, we recommend that clients reconnect to the server; otherwise, the client will be forcibly disconnected.

    \n\n

    Example: PING Connection Message

    \n\n
    // Sent from client to server\n{\n  \"type\": \"PING\"\n}\n
    \n\n

    Example: PONG Connection Message

    \n\n
    // Sent from server to client in response to a PING\n{\n  \"type\": \"PONG\"\n}\n
    \n\n

    Example: RECONNECT Connection Message

    \n\n
    // Sent from server to client\n{\n  \"type\": \"RECONNECT\"\n}\n
    \n\n

    Handling Connection Failures

    \n\n

    When a client encounters a situation where it must reconnect to the server, it should first establish a new successful WebSocket connection and then issue a LISTEN command that contains the set of topics that the application expects to receive messages on.

    \n\n

    If a client fails to connect to the server or is disconnected from the server, it should reconnect to the server using an exponential backoff. Our official client implementation initially waits one second (plus a small random jitter: see the next paragraph) to retry a failed connection and doubles the backoff period on subsequent failures, up to a maximum backoff threshold of 2 minutes. This prevents some “stampeding herd” situations where many clients simultaneously connect to the server.

    \n\n

    If a client uses timers to issue PING commands, it should add a small random jitter to the timer. This prevents some situations where many clients issue PING commands simultaneously.

    \n\n

    After a client reconnects to the server, some applications should fetch fresh state, to compensate for any missed messages while the connection was broken. For instance, our Chat application fetches the Bits leaderboard on reconnect (as it does on initial page load), in case the leaderboard received an update while the connection was down.

    \n\n

    API Limits

    \n\n
      \n
    • Clients can listen on up to 50 topics per connection. Trying to listen on more topics will result in an error message.
    • \n
    • We recommend that a single client IP address establishes no more than 10 simultaneous connections.
    • \n
    \n\n

    The two limits above are likely to be relaxed for approved third-party applications, as we start to better understand third-party requirements.

    \n\n
      \n
    • Malicious or careless applications that result in abnormally high server load may be denylisted from establishing connections.
    • \n
    • If clients are slow to read messages from their connection and the server is simultaneous buffering more than 30 messages to an individual client, the client will be disconnected.
    • \n
    \n\n

    Topics

    \n\n

    Once a client establishes a connection, it can LISTEN on topics it cares about. Clients can LISTEN on many topics at once and add new topics at any time by issuing new LISTEN commands.

    \n\n

    Once a client no longer cares about a particular set of topics, it should issue UNLISTEN commands to stop receiving messages on those topics.

    \n\n

    Authentication

    \n\n

    All topics require an OAuth token, but only some topics have a specific required scope (noted in the table below).

    \n\n

    Available Topics

    \n\n

    All topics require an OAuth token, but only some topics have a specific required scope (noted in the table).

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FeatureTopic and ExampleRequired ScopeYou are notified when…
    Bits\nchannel-bits-events-v1.<channel ID>

    Example:
    channel-bits-events-v1.44322889\n
    bits:readAnyone cheers in a specified channel.
    Bits\nchannel-bits-events-v2.<channelID>

    Example:
    channel-bits-events-v2.4602499\n
    bits:readAnyone cheers in a specified channel.
    Bits Badge Notification\nchannel-bits-badge-unlocks.<channel_id>

    Example:
    channel-bits-badge-unlocks.44322889\n
    bits:readMessage sent when a user earns a new Bits badge in a particular channel, and chooses to share the notification with chat.
    Channel Points\nchannel-points-channel-v1.<channel_id>

    Example:
    channel-points-channel-v1.44322889\n
    channel:read:redemptionsA custom reward is redeemed in a channel.
    Channel Subscriptions\nchannel-subscribe-events-v1.<channel ID>

    Example:
    channel-subscribe-events-v1.44322889\n
    channel_subscriptionsAnyone subscribes (first month), resubscribes (subsequent months), or gifts a subscription to a channel. 

    Subgift subscription messages contain recipient information.
    Chat\nchat_moderator_actions.<user ID>.<channel ID>

    Example: chat_moderator_actions.46024993.44322889\n
    channel:moderateSupports moderators listening to the topic, as well as users listening to the topic to receive their own events. 

    Examples of moderator actions are bans, unbans, timeouts, deleting messages, changing chat mode (followers-only, subs-only), changing AutoMod levels, and adding a mod.
    Whispers\nwhispers.<user ID>

    Example:
    whispers.44322889\n
    whispers:readAnyone whispers the specified user.
    \n\n

    Where:

    \n\n
      \n
    • \n<channel ID> or  <user ID> is the id field returned by the Twitch API Get Users endpoint for the respective user(s)
    • \n
    \n\n

    Note: channel-bitsevents is deprecated. For Bits events, use channel-bits-events-v2 instead.

    \n\n

    Note: channel-commerce-events-v1.<channel id> is deprecated.

    \n\n

    Requests

    \n\n

    This is an example request for Bits events. It listens to Bits events on channel 44322889. The authorization scope is specified when you generate the OAuth token using our authorization flow; see the Apps & Authentication Guide.

    \n\n
    // Request from client to server\n{\n  \"type\": \"LISTEN\",\n  \"nonce\": \"44h1k13746815ab1r2\",\n  \"data\": {\n    \"topics\": [\"channel-bits-events-v1.44322889\"],\n    \"auth_token\": \"cfabdegwdoklmawdzdo98xt2fo512y\"\n  }\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    Request ParameterTypeDescription
    typestringValid values: LISTEN, UNLISTEN.
    noncestring(Optional) Random string to identify the response associated with this request.
    dataJSONWraps the topics and auth_token fields.
    topicsarray of stringsList of topics to listen on. Valid values are any of the topics listed in Available Topics.
    auth_tokenstringOAuth token required to listen on some topics. The token is linked to either the specified <channel user ID> (for Bits events) or the specified <user ID> (for whispers events).
    \n\n

    Responses

    \n\n

    Here is a sample response:

    \n\n
    // Response from server to client\n{\n  \"type\": \"RESPONSE\",\n  \"nonce\": \"44h1k13746815ab1r2\",\n  \"error\": \"\"\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    typestringValid value: RESPONSE.
    noncestringThe nonce that was passed in the request, if one was provided there.
    errorstringThe error message associated with the request, or an empty string if there is no error.

    For Bits and whispers events requests, error responses can be: ERR_BADMESSAGE, ERR_BADAUTH, ERR_SERVER, ERR_BADTOPIC.
    \n\n

    Receiving Messages

    \n\n

    When a message for your subscription is published, you will receive a message containing the applicable data.

    \n\n

    Message Parameters: All Messages

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    ParameterTypeDescription
    typestringValid value: MESSAGE\n
    dataJSONWraps the topics and message fields.
    topicstringThe topic that the message pertains to.
    messagestringThe body of the message. Depending on the type of message, the message body contains different fields; see below.
    \n\n

    Example: Bits Event v2 Message

    \n\n
    {\n  \"type\": \"MESSAGE\",\n  \"data\": {\n     \"topic\": \"channel-bits-events-v2.46024993\",\n     \"message\": \"{\\\"data\\\":{\\\"user_name\\\":\\\"jwp\\\",\\\"channel_name\\\":\\\"bontakun\\\",\\\"user_id\\\":\\\"95546976\\\",\\\"channel_id\\\":\\\"46024993\\\",\\\"time\\\":\\\"2017-02-09T13:23:58.168Z\\\",\\\"chat_message\\\":\\\"cheer10000 New badge hype!\\\",\\\"bits_used\\\":10000,\\\"total_bits_used\\\":25000,\\\"context\\\":\\\"cheer\\\",\\\"badge_entitlement\\\":{\\\"new_version\\\":25000,\\\"previous_version\\\":10000}},\\\"version\\\":\\\"1.0\\\",\\\"message_type\\\":\\\"bits_event\\\",\\\"message_id\\\":\\\"8145728a4-35f0-4cf7-9dc0-f2ef24de1eb6\\\",\\\"is_anonymous\\\":true}\"\n  }\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    \nbadge_entitlement
    (optional)
    object Information about a user’s new badge level, if the cheer was not anonymous and the user reached a new badge level with this cheer. Otherwise, null.
    bits_usedintegerNumber of bits used.
    channel_idstringID of the channel in which Bits were used.
    chat_messagestringChat message sent with the cheer.
    contextstringEvent type associated with this use of Bits.
    is_anonymousBooleanWhether or not the event was anonymous.
    message_idstringMessage ID.
    message_typestringThe type of object contained in the data field.
    timestringTime when the Bits were used.
    RFC 3339 format.
    total_bits_usedintegerAll time total number of Bits used in the channel by a specified user.
    \nuser_id 
    (optional)
    stringUser ID of the person who used the Bits - if the cheer was not anonymous.
    Null if anonymous.
    \nuser_name
    (optional)
    stringLogin name of the person who used the Bits - if the cheer was not anonymous. 
    Null if anonymous
    versionstringMessage version
    \n\n

    Example: Bits Event v1 Message

    \n\n
    {\n   \"type\": \"MESSAGE\",\n   \"data\": {\n      \"topic\": \"channel-bits-events-v1.44322889\",\n      \"message\": \"{\\\"data\\\":{\\\"user_name\\\":\\\"dallasnchains\\\",\\\"channel_name\\\":\\\"dallas\\\",\\\"user_id\\\":\\\"129454141\\\",\\\"channel_id\\\":\\\"44322889\\\",\\\"time\\\":\\\"2017-02-09T13:23:58.168Z\\\",\\\"chat_message\\\":\\\"cheer10000 New badge hype!\\\",\\\"bits_used\\\":10000,\\\"total_bits_used\\\":25000,\\\"context\\\":\\\"cheer\\\",\\\"badge_entitlement\\\":{\\\"new_version\\\":25000,\\\"previous_version\\\":10000}},\\\"version\\\":\\\"1.0\\\",\\\"message_type\\\":\\\"bits_event\\\",\\\"message_id\\\":\\\"8145728a4-35f0-4cf7-9dc0-f2ef24de1eb6\\\"}\"\n   }\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    badge_entitlementobjectInformation about the user’s new badge level, if the user reached a new badge level with this cheer; otherwise. null.
    bits_usedintegerNumber of Bits used.
    channel_idstringUser ID of the channel on which Bits were used.
    channel_namestringName of the channel on which Bits were used.
    chat_messagestringChat message sent with the cheer.
    contextstringEvent type associated with this use of Bits (for example, cheer).
    message_idstringMessage ID
    message_typestringMessage type (that is, the type of object contained in the data field)
    timestringTime when the Bits were used. RFC 3339 format.
    total_bits_usedintegerAll-time total number of Bits used on this channel by the specified user.
    user_idstringUser ID of the person who used the Bits.
    user_namestringLogin name of the person who used the Bits.
    versionstringMessage version
    \n\n

    Example: Bits Badge Notification Message

    \n\n
    {\n     \"type\":\"MESSAGE\",\"data\":{\"topic\":\"channel-bits-badge-unlocks.401394874\",\"message\":\"\n     {\n          \\\"user_id\\\":\\\"232889822\\\",\\\"user_name\\\":\\\"willowolf\\\",\\\"channel_id\\\":\\\"401394874\\\",\\\"channel_name\\\":\\\"fun_test12345\\\",\\\"badge_tier\\\":1000,\\\"chat_message\\\":\\\"this should be received by the public pubsub listener\\\",\\\"time\\\":\\\"2020-12-06T00:01:43.71253159Z\\\"}\"\n     }\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    user_idstringID of user who earned the new Bits badge
    user_namestringLogin of user who earned the new Bits badge
    channel_idstringID of channel where user earned the new Bits badge
    channel_namestringLogin of channel where user earned the new Bits badge
    badge_tierintegerValue of Bits badge tier that was earned (1000, 10000, etc.)
    chat_messagestring[Optional] Custom message included with share
    timestringTime when the new Bits badge was earned.
    RFC 3339 format.
    \n\n

    Example: Channel Points Event Message

    \n\n
    {\n\"type\": \"reward-redeemed\",\n\"data\": {\n  \"timestamp\": \"2019-11-12T01:29:34.98329743Z\",\n  \"redemption\": {\n    \"id\": \"9203c6f0-51b6-4d1d-a9ae-8eafdb0d6d47\",\n    \"user\": {\n      \"id\": \"30515034\",\n      \"login\": \"davethecust\",\n      \"display_name\": \"davethecust\"\n    },\n    \"channel_id\": \"30515034\",\n    \"redeemed_at\": \"2019-12-11T18:52:53.128421623Z\",\n    \"reward\": {\n      \"id\": \"6ef17bb2-e5ae-432e-8b3f-5ac4dd774668\",\n      \"channel_id\": \"30515034\",\n      \"title\": \"hit a gleesh walk on stream\",\n      \"prompt\": \"cleanside's finest \\n\",\n      \"cost\": 10,\n      \"is_user_input_required\": true,\n      \"is_sub_only\": false,\n      \"image\": {\n        \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/30515034/6ef17bb2-e5ae-432e-8b3f-5ac4dd774668/7bcd9ca8-da17-42c9-800a-2f08832e5d4b/custom-1.png\",\n        \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/30515034/6ef17bb2-e5ae-432e-8b3f-5ac4dd774668/7bcd9ca8-da17-42c9-800a-2f08832e5d4b/custom-2.png\",\n        \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/30515034/6ef17bb2-e5ae-432e-8b3f-5ac4dd774668/7bcd9ca8-da17-42c9-800a-2f08832e5d4b/custom-4.png\"\n      },\n      \"default_image\": {\n        \"url_1x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-1.png\",\n        \"url_2x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-2.png\",\n        \"url_4x\": \"https://static-cdn.jtvnw.net/custom-reward-images/default-4.png\"\n      },\n      \"background_color\": \"#00C7AC\",\n      \"is_enabled\": true,\n      \"is_paused\": false,\n      \"is_in_stock\": true,\n      \"max_per_stream\": { \"is_enabled\": false, \"max_per_stream\": 0 },\n      \"should_redemptions_skip_request_queue\": true\n    },\n    \"user_input\": \"yeooo\",\n    \"status\": \"FULFILLED\"\n    }\n  }\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    timestampstringTime the pubsub message was sent
    redemptionobjectData about the redemption, includes unique id and user that redeemed it
    channel_idstringID of the channel in which the reward was redeemed.
    redeemed_atstringTimestamp in which a reward was redeemed
    rewardobjectData about the reward that was redeemed
    \nuser_input
    (optional)
    stringA string that the user entered if the reward requires input
    statusstringreward redemption status, will be FULFULLED if a user skips the reward queue, UNFULFILLED otherwise
    \n\n

    Example: Channel Subscriptions Event Message

    \n\n

    The data field is a JSON object that contains topic and message fields. Typically, message is a JSON object that has been escaped (see “Example: Bits Event Message”) and cast into a string.

    \n\n

    Note: The months field is deprecated. We now have fields for cumulative-months and streak-months.

    \n\n

    Following is an example of a sub/resub message:

    \n\n
    {\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"user_name\": \"tww2\",\n      \"display_name\": \"TWW2\",\n      \"channel_name\": \"mr_woodchuck\",\n      \"user_id\": \"13405587\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"cumulative_months\": 9,\n      \"streak_months\": 3,\n      \"context\": \"resub\",\n      \"is_gift\": false,\n      \"sub_message\": {\n        \"message\": \"A Twitch baby is born! KappaHD\",\n        \"emotes\": [\n          {\n            \"start\": 23,\n            \"end\": 7,\n            \"id\": 2867\n          }\n        ]\n      }\n    }\n  }\n}\n
    \n\n

    Here is an example of a subgift message, which contains recipient information.

    \n\n
    {\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"user_name\": \"tww2\",\n      \"display_name\": \"TWW2\",\n      \"channel_name\": \"mr_woodchuck\",\n      \"user_id\": \"13405587\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"months\": 9,\n      \"context\": \"subgift\",\n      \"is_gift\": true,\n      \"sub_message\": {\n        \"message\": \"\",\n        \"emotes\": null\n      },\n      \"recipient_id\": \"19571752\",\n      \"recipient_user_name\": \"forstycup\",\n      \"recipient_display_name\": \"forstycup\"\n    }\n  }\n}\n
    \n\n

    Here is an example of a multi-month subgift message, which contains recipient information as well as the number of months gifted.

    \n\n
    {\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"user_name\": \"tww2\",\n      \"display_name\": \"TWW2\",\n      \"channel_name\": \"mr_woodchuck\",\n      \"user_id\": \"13405587\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"months\": 9,\n      \"context\": \"subgift\",\n      \"is_gift\": true,\n      \"sub_message\": {\n        \"message\": \"\",\n        \"emotes\": null\n      },\n      \"recipient_id\": \"19571752\",\n      \"recipient_user_name\": \"forstycup\",\n      \"recipient_display_name\": \"forstycup\",\n      \"multi_month_duration\": 6\n    }\n  }\n}\n
    \n\n

    Here is an example of an anonsubgift message. This is like subgift but contains no sender information, since the gifter is anonymous.

    \n\n
    {\n  \"type\": \"MESSAGE\",\n  \"data\": {\n    \"topic\": \"channel-subscribe-events-v1.44322889\",\n    \"message\": {\n      \"channel_name\": \"mr_woodchuck\",\n      \"channel_id\": \"89614178\",\n      \"time\": \"2015-12-19T16:39:57-08:00\",\n      \"sub_plan\": \"1000\",\n      \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n      \"months\": 9,\n      \"context\": \"anonsubgift\",\n      \"is_gift\": true,\n      \"sub_message\": {\n        \"message\": \"\",\n        \"emotes\": null\n      },\n      \"recipient_id\": \"13405587\",\n      \"recipient_user_name\": \"tww2\",\n      \"recipient_display_name\": \"TWW2\"\n    }\n  }\n}\n
    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    FieldTypeDescription
    channel_idstringID of the channel that has been subscribed or subgifted
    channel_namestringName of the channel that has been subscribed or subgifted
    contextstringEvent type associated with the subscription product, values: sub, resub, subgift, anonsubgift, resubgift, anonresubgift\n
    dataJSONWraps the topics and message fields
    user_idstringUser ID of the person who subscribed or sent a gift subscription
    user_namestringLogin name of the person who subscribed or sent a gift subscription
    display_namestringDisplay name of the person who subscribed or sent a gift subscription
    messagestringThe body of the user-entered resub message. Depending on the type of message, the message body contains different fields
    monthsintCumulative number of months the gifter has giften in the channel (Deprecated)
    recipient_idstringUser ID of the subscription gift recipient
    recipient_user_namestringLogin name of the subscription gift recipient
    recipient_display_namestringDisplay name of the person who received the subscription gift
    sub_planstringSubscription Plan ID, values: Prime, 1000, 2000, 3000\n
    sub_plan_namestringChannel Specific Subscription Plan Name
    timestringTime when the subscription or gift was completed. RFC 3339 format
    topicstringThe topic that the message pertains to
    typestringValid value: MESSAGE
    cumulative_monthsstringCumulative number of tenure months of the subscription
    streak_monthsstringDenotes the user’s most recent (and contiguous) subscription tenure streak in the channel
    is_giftboolIf this sub message was caused by a gift subscription
    multi_month_durationintNumber of months gifted as part of a single, multi-month gift OR number of months purchased as part of a multi-month subscription
    \n\n

    Example: Whispers Event Message

    \n\n

    The data field is a JSON object that contains topic and message fields. Typically, message is a JSON object that has been escaped (see “Example: Bits Event Message” above) and cast into a string.

    \n\n
    {\n  \"type\":\"MESSAGE\",\n  \"data\":{\n     \"topic\":\"whispers.44322889\",\n     \"message\":{\n        \"type\":\"whisper_received\",\n        \"data\":{\n           \"id\":41\n        },\n        \"thread_id\":\"129454141_44322889\",\n        \"body\":\"hello\",\n        \"sent_ts\":1479160009,\n        \"from_id\":39141793,\n        \"tags\":{\n           \"login\":\"dallas\",\n           \"display_name\":\"dallas\",\n           \"color\":\"#8A2BE2\",\n           \"emotes\":[\n\n           ],\n           \"badges\":[\n              {\n                 \"id\":\"staff\",\n                 \"version\":\"1\"\n              }\n           ]\n        },\n        \"recipient\":{\n           \"id\":129454141,\n           \"username\":\"dallasnchains\",\n           \"display_name\":\"dallasnchains\",\n           \"color\":\"\",\n           \"badges\":[]\n        },\n        \"nonce\":\"6GVBTfBXNj7d71BULYKjpiKapegDI1\"\n     },\n     \"data_object\":{\n        \"id\":41,\n        \"thread_id\":\"129454141_44322889\",\n        \"body\":\"hello\",\n        \"sent_ts\":1479160009,\n        \"from_id\":44322889,\n        \"tags\":{\n           \"login\":\"dallas\",\n           \"display_name\":\"dallas\",\n           \"color\":\"#8A2BE2\",\n           \"emotes\":[],\n           \"badges\":[\n              {\n                 \"id\":\"staff\",\n                 \"version\":\"1\"\n              }\n           ]\n        },\n        \"recipient\":{\n           \"id\":129454141,\n           \"username\":\"dallasnchains\",\n           \"display_name\":\"dallasnchains\",\n           \"color\":\"\",\n           \"badges\":[]\n        },\n        \"nonce\":\"6GVBTfBXNj7d71BULYKjpiKapegDI1\"\n     }\n  }\n}\n
    \n\n

    The fields in this message are similar to IRC fields. See the Chatbots and IRC documentation.

    \n\n

    Example: Multi-month Subscription Message

    \n\n

    Here is an example of a multi-month subscription message. This message is published upon purchase, auto-renewal, or re-subscription for a multi-month, recurring subscription

    \n\n
     {\n   \"type\": \"MESSAGE\",\n   \"data\": {\n     \"topic\": \"channel-subscribe-events-v1.44322889\",\n     \"message\": {\n       \"user_name\": \"tww2\",\n       \"display_name\": \"TWW2\",\n       \"channel_name\": \"mr_woodchuck\",\n       \"user_id\": \"13405587\",\n       \"channel_id\": \"89614178\",\n       \"time\": \"2015-12-19T16:39:57-08:00\",\n       \"sub_plan\": \"1000\",\n       \"sub_plan_name\": \"Channel Subscription (mr_woodchuck)\",\n       \"months\": 4,\n       \"context\": \"sub\",\n       \"is_gift\": false,\n       \"sub_message\": {\n         \"message\": \"\",\n         \"emotes\": null\n       },\n       \"recipient_id\": \"19571752\",\n       \"recipient_user_name\": \"forstycup\",\n       \"recipient_display_name\": \"forstycup\",\n       \"multi_month_duration\": 6\n     }\n }\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","v5":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Getting a client ID
    \n\t\t\n\t\t\t
    Requests
    \n\t\t\n\t\t\t
    Translating from user names to user IDs
    \n\t\t\n\t\t\t
    Responses
    \n\t\t\n\t\t\t
    Errors
    \n\t\t\n\t\n\n\n\t\t

    Using the Legacy Twitch API v5

    \n\n

    Introduction

    \n\n

    This guide covers:

    \n\n
      \n
    • Getting a client ID
    • \n
    • Requests
    • \n
    • Translating from user names to user IDs
    • \n
    • Responses
    • \n
    • Errors
    • \n
    • Broadcasting overview and stream keys
    • \n
    \n\n

    Getting a client ID

    \n\n

    To identify your application to the API, every request must include your application’s client ID, either explicitly or implicitly by including an OAuth token. If you use an OAuth token in your request, the API figures out the client ID for you.

    \n\n

    Requests can include both a client ID and an OAuth token. Requests without either one fail with an HTTP 400 error.

    \n\n

    To get a client ID, register your application on the Twitch developer portal. Once you have your client ID, you can send it via:

    \n\n
      \n
    • Request header (Client-ID: XXXXX)
    • \n
    • Query-string parameter
      (https://api.twitch.tv/kraken/users/44322889?client_id=XXXXX)
    • \n
    \n\n

    Requests

    \n\n

    For client IDs created on or after May 31, 2019, the only available version of the Legacy Twitch API is v5.  For client IDs created prior to May 31, 2019, use the Accept: application/vnd.twitchtv.v5+json header on your requests to access v5 of the Legacy Twitch API API.

    \n\n

    Translating from user names to user IDs

    \n\n

    Legacy Twitch API v5 APIs use user IDs, whereas older versions of the APIs used user names. To translate from a user name to a user ID, use the Get Users endpoint with up to 100 logins:

    \n\n
    curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X GET https://api.twitch.tv/kraken/users?login=dallas,dallasnchains\n
    \n\n

    The response is a JSON blob that contains the user objects for the specified users:

    \n\n
    {\n   \"_total\": 2,\n   \"users\": [\n      {\n         \"_id\": \"44322889\",\n         \"bio\": \"Just a gamer playing games and chatting. :)\",\n         \"created_at\": \"2013-06-03T19:12:02.580593Z\",\n         \"display_name\": \"dallas\",\n         \"logo\": \"https://static-cdn.jtvnw.net/jtv_user_pictures/dallas-profile_image-1a2c906ee2c35f12-300x300.png\",\n         \"name\": \"dallas\",\n         \"type\": \"staff\",\n         \"updated_at\": \"2017-02-09T16:32:06.784398Z\"\n      },\n      {\n         \"_id\": \"129454141\",\n         \"bio\": null,\n         \"created_at\": \"2016-07-13T14:40:42.398257Z\",\n         \"display_name\": \"dallasnchains\",\n         \"logo\": null,\n         \"name\": \"dallasnchains\",\n         \"type\": \"user\",\n         \"updated_at\": \"2017-02-04T14:32:38.626459Z\"\n      }\n   ]\n}\n
    \n\n

    Root URL

    \n\n

    The root for all API resources is https://api.twitch.tv/kraken.

    \n\n

    If you submit a request to the root URL and you are authenticated, the response includes the status of your token. For example, this request:

    \n\n
    curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Authorization: OAuth cfabdegwdoklmawdzdo98xt2fo512y' \\\n-X GET https://api.twitch.tv/kraken\n
    \n\n

    Gets this response:

    \n\n
    {\n   \"token\": {\n      \"authorization\": {\n         \"created_at\": \"2016-12-14T15:51:16Z\",\n         \"scopes\": [\n            \"user_read\"\n         ],\n         \"updated_at\": \"2016-12-14T15:51:16Z\"\n      },\n      \"client_id\": \"uo6dggojyb8d6soh92zknwmi5ej1q2\",\n      \"user_id\": \"44322889\",\n      \"user_name\": \"dallas\",\n      \"valid\": true\n   }\n}\n
    \n\n

    Blank fields

    \n\n

    Blank fields are included as null.

    \n\n

    JSON and JSONP

    \n\n

    All data is sent and received as JSON.

    \n\n

    All API endpoints support JSONP by providing a callback parameter with the request:

    \n\n

    curl -i https://api.twitch.tv/kraken?callback=foo

    \n\n

    The returned MIME type for JSONP requests is:

    \n\n

    application/javascript

    \n\n

    Query Parameters

    \n\n

    In the reference documentation for endpoints, query string parameters are listed where they apply to an endpoint. The syntax for using query string parameters is as follows:

    \n\n
    <URL for the endpoint, with required params>?<query param 1>=<value 1>&<query param 2>=<value 2>...\n
    \n\n

    For example, the Get Feed Posts endpoint has three optional query string parameters, limit, cursor, and comments. If all three query string parameters are used, the URL is:

    \n\n
    https://api.twitch.tv/kraken/feed/<feed user ID>/posts?limit=<limit value>&cursor=<cursor value>\n&comments=<comments value>\n
    \n\n

    Responses

    \n\n

    All responses are JSON objects.

    \n\n

    Paging through results: cursor v. offset

    \n\n

    When fetching multiple items, there are two different mechanisms to page through results, offset and cursor.

    \n\n

    For some endpoints, you set a limit, set offset to 0, and add the limit value to the offset value each time you want to see the next page.

    \n\n

    For other endpoints, offset is deprecated; instead, a cursor is returned. This is used to tell the server where to start fetching the next set of results. For example:

    \n\n
    curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X GET https://api.twitch.tv/kraken/channels/44322889/follows\n
    \n\n

    might return something like this:

    \n\n
    {\n   \"_cursor\": \"1481675542963907000\",\n   \"_total\": 41,\n   \"follows\": [{\n      \"created_at\": \"2016-12-14T00:32:22.963907Z\",\n      \"notifications\": false,\n      \"user\": {\n            \"_id\": \"129454141\",\n            \"bio\": null,\n            \"created_at\": \"2016-07-13T14:40:42.398257Z\",\n            \"display_name\": \"dallasnchains\",\n            \"logo\": null,\n            \"name\": \"dallasnchains\",\n            \"type\": \"user\",\n            \"updated_at\": \"2016-12-14T00:32:16.263122Z\"\n      }\n   },\n   ...\n   ]\n}\n
    \n\n

    For the next page of results, construct your query as follows:

    \n\n
    curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X GET https://api.twitch.tv/kraken/channels/44322889/follows?cursor=1481675542963907000\n
    \n\n

    You would get the next set of results, as well as the next cursor.

    \n\n

    When there are no more items to be returned, the cursor in the response is blank.

    \n\n

    The correct parameter to use (offset or cursor) is noted in the reference documentation for each endpoint.

    \n\n

    Errors

    \n\n

    All error responses have the following format, delivered with a standard HTTP status code. The error message varies depending on the endpoint.

    \n\n
    {\n  \"message\":\"Invalid Token\",\n  \"status\":401,\n  \"error\":\"Unauthorized\"\n}\n
    \n\n

    Common response codes are:

    \n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    HTTP Status CodeExplanation
    400\nRequest Not Valid. Something is wrong with the request.
    401\nUnauthorized. The OAuth token does not have the correct scope or does not have the required permission on behalf of the specified user.
    403\nForbidden. This usually indicates that authentication was provided, but the authenticated user is not permitted to perform the requested operation. For example, a user who is not a partner might have tried to start a commercial.
    404\nNot Found. For example, the channel, user, or relationship could not be found.
    422\nUnprocessable Entity. For example, for a user subscription endpoint, the specified channel does not have a subscription program.
    429Too Many Requests
    500Internal Server Error
    503\nService Unavailable. For example, the status of a game or ingest server cannot be retrieved.
    \n\n

    When using JSONP, the status code is always 200, to allow browsers to parse it. Check the body of the response for the error data.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","clips-discovery":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Example: Retrieving Trending Clips for a Game
    \n\t\t\n\t\t\t
    Example: Retrieving Most Viewed Clips for a Channel
    \n\t\t\n\t\n\n\n\t\t

    Clips Discovery Guide

    \n\n

    Introduction

    \n\n

    Clips discovery endpoints enable you to discover user-generated, short-form video content about a game or channel or from a user’s followed games. You can retrieve clips in multiple ways, such as for a specified time period or based on viewcount or trending popularity.

    \n\n

    You can use clips discovery in conjunction with video embedding to showcase the top content about your game or channel directly on your own Web site. (See the Embedding Video & Clips guide.)

    \n\n

    This guide cover two clips discovery use cases:

    \n\n
      \n
    • Retrieving the trending clips for a specified game.
    • \n
    • Retrieving the most viewed clips for a specified channel.
    • \n
    \n\n

    Both scenarios take advantage of video embedding, to show a complete, end-to-end experience.

    \n\n

    Also see the Clips Reference.

    \n\n\n\n

    In this example, we use a simple HTML page that requests clips for a specified game and embeds clips for the top 10 trending clips.

    \n\n

    First, we create a simple HTML page with a div id that we will use later to display the embedded clips:

    \n\n
    <html>\n<head>\n   <title>Clips Carousel</title>\n</head>\n<body>\n   <div id=\"clips-display\"></div>\n</body>\n</html>\n
    \n\n

    Second, we add JavaScript to the page, to request the clips and handle the event when data has loaded:

    \n\n
    var httpRequest = new XMLHttpRequest();\n\nhttpRequest.addEventListener('load', clipsLoaded);\nhttpRequest.open('GET', 'https://api.twitch.tv/kraken/clips/top?limit=10&game=Overwatch&trending=true');\nhttpRequest.setRequestHeader('Client-ID', 'uo6dggojyb8d6soh92zknwmi5ej1q2');\nhttpRequest.setRequestHeader('Accept', 'application/vnd.twitchtv.v5+json');\nhttpRequest.send();\n
    \n\n

    Finally, we add JavaScript to display the clips embeds on the page:

    \n\n
    function clipsLoaded() {\n    var clipsDisplay = document.getElementById('clips-display'),\n        clipList = JSON.parse(httpRequest.responseText);\n\n    clipList.clips.forEach(function(clip, index, array) {\n        clipItem = document.createElement('div');\n        clipItem.innerHTML = clip.embed_html;\n        clipsDisplay.appendChild(clipItem);\n    });\n}\n
    \n\n

    Example: Retrieving Most Viewed Clips for a Channel

    \n\n

    For this example, we re-use the HTML and rendering above and simply change the JavaScript call in the second part, to get the most-viewed clips:

    \n\n
    var httpRequest = new XMLHttpRequest();\n\nhttpRequest.addEventListener('load', clipsLoaded);\nhttpRequest.open('GET', 'https://api.twitch.tv/kraken/clips/top?limit=10&channel=moonmoon_ow');\nhttpRequest.setRequestHeader('Client-ID', 'uo6dggojyb8d6soh92zknwmi5ej1q2');\nhttpRequest.setRequestHeader('Accept', 'application/vnd.twitchtv.v5+json');\nhttpRequest.send();\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","video-upload":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Introduction
    \n\t\t\n\t\t\t
    Video Formats
    \n\t\t\n\t\t\t
    Rate Limits
    \n\t\t\n\t\t\t
    How to Upload a Video
    \n\t\t\n\t\n\n\n\t\t

    Video Upload Guide

    \n\n

    Introduction

    \n\n

    With video upload endpoints, you can upload videos directly to Twitch. These video endpoints enable you to create tools for creating and managing videos on Twitch.

    \n\n

    Broadcasters often like to add personal branding (for intros and outros) and create compilation videos from their streams. With the video endpoints, you can enable those experiences and upload the end result directly to Twitch.

    \n\n

    Note: You must be a partner or affiliate to upload VODs.

    \n\n

    Video Formats

    \n\n

    When uploading a video, the API accepts the following formats:

    \n\n
      \n
    • MP4, MOV, AVI and FLV file formats
    • \n
    • AAC audio
    • \n
    • h264 codec
    • \n
    • Up to 10Mbps bitrate
    • \n
    • Up to 1080p/60FPS
    • \n
    \n\n

    Rate Limits

    \n\n

    There is a rate limit of 5 simultaneous uploads per user, with a maximum of 100 uploads in 24 hours.

    \n\n

    How to Upload a Video

    \n\n

    1. Get an Authentication Token

    \n\n

    You need an OAuth token with the channel_editor scope for the channel where the video will live. Once you have the token, you add it to the Authorization header when you create the video.

    \n\n

    For information about getting OAuth access tokens, see the Apps & Authentication Guide.

    \n\n

    2. Create a Video

    \n\n

    See the Create Video endpoint.

    \n\n

    This example creates a video entitled “Test video” in the 44322889 channel.

    \n\n
    curl -H 'Accept: application/vnd.twitchtv.v5+json' \\\n-H 'Authorization: OAuth cfabdegwdoklmawdzdo98xt2fo512y' \\\n-H 'Client-ID: uo6dggojyb8d6soh92zknwmi5ej1q2' \\\n-X POST 'https://api.twitch.tv/kraken/videos?channel_id=44322889&title=Test video'\n
    \n\n

    The response will include the following information, which is used in subsequent steps:

    \n\n
      \n
    • video ID: 106400740\n
    • \n
    • upload token: 7_STl2...\n
    • \n
    \n\n

    3. Upload Video Parts

    \n\n

    See the Upload Video Part endpoint.

    \n\n

    This uploads the first part of video 106400740, created in the prior step.

    \n\n
    curl -H 'Content-Length: 8896493' \\\n--data-binary \"@test.mp4\" \\\n-X PUT 'https://uploads.twitch.tv/upload/106400740?part=1&upload_token=7_STl2gsKwDy1mHj2k95ld3aodDl3E_NzzQdSlN9ll0p6Ct0xFhvrO5bWu7tGUKEH5jtD_hjB9q3X4vTOQ000B1UcmMxduT30FuHhAmFYgYf7DoJE9PVvGRZqk9WQAR2ZGphUpj_237smnjE2gMoaQ--'\n
    \n\n

    4. Complete the Video Upload

    \n\n

    See the Complete Video Upload endpoint.

    \n\n

    This example completes the upload of video 106400740.

    \n\n
    curl -X POST 'https://uploads.twitch.tv/upload/106400740/complete?upload_token=7_STl2gsKwDy1mHj2k95ld3aodDl3E_NzzQdSlN9ll0p6Ct0xFhvrO5bWu7tGUKEH5jtD_hjB9q3X4vTOQ000B1UcmMxduT30FuHhAmFYgYf7DoJE9PVvGRZqk9WQAR2ZGphUpj_237smnjE2gMoaQ--'\n
    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n","video-broadcast":"\n\n\n\t\n \n \n \n\n \n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n\t\n \n\n \n\t\n\t\n Twitch Developers\n \n\n\n\t
    \n\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\n\t\t\n\t\t\n\n\n
    \n\t
    \n\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t\"twitch\n\t\t\t\t\t\n\t\t\t\t
    \n\n\t\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t\t
    \n\t\t\t\t
    \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tProducts\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tExtensions\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tE2\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDrops\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch API\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnalytics\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tCase Studies\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tCode Samples\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tGuides\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tSupport\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tDeveloper Forum\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tTwitch Dev Chat\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\t@TwitchDev\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tBlog\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\t\tDocs\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t
      \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAPI References\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tAnd\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tOther\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tSuch\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\t\tItems\n\t\t\t\t\t\t\t\t\t\t\t
    • \n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
  • \n\t\t\t\t\t\n\t\t\t\t
    \n\t\t\t
    \n\t\t
    \n\t
    \n
    \n\n\n\t\t
    \n\t\t\t
    \n\n\n\t\n\t\n\n\t
    \n\t\tContents\n\t
    \n\t
    \n\t\t
    \n\t\t\t\n \n \n\t\t
    \n\t
    \n\t
    \n\t\t\n\t\n\t\n\t\t\n\t\t\t
    Video Broadcasting Overview
    \n\t\t\n\t\t\t
    Broadcast URLs and Stream Keys
    \n\t\t\n\t\n\n\n\t\t

    Video Broadcasting Overview

    \n\n

    There are thousands of Twitch broadcasters. A broadcaster sends a video stream to Twitch using any of several tools:

    \n\n
      \n
    • Streaming encoder, normally a software implementation like Twitch Studio, Streamlabs, OBS Studio, or Xsplit.
    • \n
    • Consoles like Xbox One, Xbox Series S|X, Playstation 4, Playstation 5.
    • \n
    • Hardware video encoder
    • \n
    \n\n

    The tool sends a video signal captured from the broadcaster’s game and cameras, through the open Internet, into Twitch using Real-Time Messaging Protocol (RTMP).

    \n\n

    The first stop for a broadcast stream is the Twitch ingesting subsystem, where streams enter Twitch and are authorized and registered, then prepared for viewers. You select an ingest server to receive your stream. There are many ingest servers, each living in a PoP (Point of Presence, a small-to-medium deployment of servers in a co-location facility, normally at a major internet exchange point).

    \n\n

    Broadcast URLs and Stream Keys

    \n\n

    Each broadcast uses an RTMP URL with this format:

    \n\n

    rtmp://<ingest-server>/app/<stream-key>[?bandwidth_test=true]

    \n\n

    Where:

    \n\n
      \n
    • \n

      <ingest-server> identifies a specific Twitch server that receives this broadcast stream; e.g., sfo.contribute.live-video.net.

      \n
    • \n
    • \n

      <stream-key> (also known as authorization key) uniquely identifies this stream. Stream keys are assigned by Twitch. Broadcasters can retrieve the keys from the broadcaster dashboard on www.twitch.tv or through the Get Stream Key API.

      \n
    • \n
    • \n

      <bandwidth_test=true> is an optional query-string parameter that disables live viewing of the stream. It is used to verify bandwidth health.

      \n
    • \n
    \n\n

    Example: rtmp://sfo.contribute.live-video.net/app/live_user_123456789?bandwidth_test=true

    \n\n

    For more detailed recommendations on broadcasting guidelines and codecs, please consult https://stream.twitch.tv.

    \n\n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t\t
    \n\t\t\t\n
    \n\n \n \n
    \n \n\t\t
    \n\t
    \n\n\n\n\n\n\n\n \n\n\n
    \n\t\t
    \n\n\t\t\n
    \n\t\n
    \n\t\t\n\t\t\n\t
    \n\n"}},"baseurl":null,"title":"Twitch Developer Documentation"}};

    Email


    Integromat


    {{ end }}